如何解决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 ++不能解决舍入。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...