如何解决如何解决gcc中的c ++ std :: rintf问题
我不明白,为什么 fun tryAcquire(lockId: String?,timeout: Long,unit: TimeUnit): Boolean {
if (lockId != null) {
var success = false
lockedList.compute(lockId) { id,value ->
if (value == null) {
println("Locking file $id")
val newLock = CustomLock(id)
newLock.writeLock().lock()
success = true
println("Locked file $id")
return@compute newLock
}
println("Locking file $id Existing lock")
val lock = value.writeLock()
if (lock.tryLock() || lock.tryLock(timeout,unit)) {
success = true
println("Locked file $id")
}
return@compute value
}
return success
} else {
throw InvalidParameterException("ERROR: lockId or ownerId is null!")
}
}
返回以下结果(g ++ 7.3.0):
std::rintf
结果:
cout << rintf(14.5f) << endl;
cout << rintf(15.5f) << endl;
cout << rintf(16.5f) << endl;
源编号可以精确地存储在float中,因此这不应该是计算问题。
我检查了源,并使用了14
16
16
。
我当然可以编写自己的函数,但是这个问题困扰着我。
解决方法
这是“银行家四舍五入”,也称为“四舍五入”。问题是x.5的值恰好在x和x + 1之间的一半。有很多可能的方法来处理这样的舍入值。四舍五入为偶数,因此14.5变为14,15.5变为16,16.5变为16。我听说经过一堆计算,这可以减少累积舍入误差。
其他可能性包括向0舍入:14.5变为14,-14.5变为-14;向负无穷大舍入(向下舍入):14.5变为14,-14.5变为-15;从0开始舍入:14.5变为15,-14.5变为-15;向正无穷大取整(向上取整):14.5变为15,-14.5变为-14。
通常有一种选择舍入模式的方法,但是标准C ++不能解决舍入。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。