当前位置: 首页 > 知识库问答 >
问题:

四舍五入浮点值,例如单精度

公宜春
2023-03-14

C和C++提供了几种宽度的浮点数据类型,但它们没有指定精度。编译器可以自由地使用理想化的算术来简化表达式,使用双精度来计算float值上的表达式,或者使用双精度寄存器来保留float变量或公共子表达式的值。

纠正我如果我是错的是错的,请参见编辑,但是将内存中的float提升到双精度寄存器中也是合法的,所以存储一个值然后加载回来并不一定会截断位。

将一个数字转换成一个较低精度的最安全、最便携的方法是什么?理想情况下,在SSE2上编译到cvtsd2ss也应该是高效的。(因此,虽然volatile可能是一个答案,但我更喜欢更好的答案。)

编辑:总结一些评论和发现…

  • 中间结果的更大精度始终是公平的。
  • 表达式简化在C++中是允许的,在C中则给出fp_contract on
  • 不允许对单精度浮点数使用双精度(在C或C++中)。

然而,一些编译器(特别是x86-32上的GCC)非法地忘记了一些精确转换。

请注意,允许标识x-x=0a+b-b+c简化为a+c与使加法可交换或相联不同。a+b+c仍然与a+c+ba+(b+c)不同,因为CPU只提供两个加数和一个四舍五入的结果。

共有1个答案

夏侯彬郁
2023-03-14

C99 5.2.4.2.2P8过分地说

分配和强制转换[..]移除所有额外的量程和精度

因此,如果希望将范围和精度限制为浮点的范围和精度,只需强制转换为float或赋值为float变量。

您甚至可以做类似(double)((float)d)这样的事情(带有额外的括号以确保用户正确阅读),将变量d限制为float的精度和范围,然后将其转换回double。(即使ddouble,标准C编译器也不允许对其进行优化;它必须将精度和范围限制为float的精度和范围。)

我已经在例如Kahan求和算法的实际实现中使用了这一点,在这里,它可以被用来允许C编译器进行非常积极的优化,但没有失效的风险。

 类似资料:
  • 例如,当我在控制台中运行0.1+0.2时,它返回0.300000000000000004。然而,当我运行0.1+0.3时,它正确地返回0.4。 是否有任何逻辑可以确定哪些特定的浮动不会被“正确”舍入?

  • 问题是,每当我使用“System.out.printf(”%.2F\n“,BMI)”时,输出将四舍五入,而不是切断小数点的其余部分。下面是我的代码:

  • 问题内容: 假设我有,我想将其转换为。如何在Python中完成此操作? 给与不。我是Python或一般编程的新手。 我不想将其打印为字符串,结果将被进一步使用。有关此问题的更多信息,请查看 Tim Wilson的Python编程技巧:贷款和付款计算器 。 问题答案: (或的结果)正确舍入为小数点后两位。数学上,这听起来像您想要的是天花板功能。Python模块中的一个名为: 地板和天花板功能通常分别

  • 本节讨论了精度数学的四舍五入特性,ROUND()函数,以及插入DECIMAL列时的四舍五入特性。 ROUND()函数的行为取决于其参量是准确的还是近似的: ·对于准确值数值,ROUND()采用“半值向上舍入”规则:如果小数部分的值为.5或更大,如果是正数,向上取下一个整数,如果是负数,向下取下一个整数(换句话讲,以0为界限执行舍入)。如果小数部分的值小于.5,如果是正数,向下取下一个整数,如果是负

  • 问题内容: 我怎么总是将a舍入为一个,而不舍入它。我知道,但是我希望它总是四舍五入。因此,如果为,则四舍五入为4。 问题答案: 您可以使用方法。 请参阅JavaDoc链接:https ://docs.oracle.com/javase/10/docs/api/java/lang/Math.html#ceil(double ) 从文档: 细胞 返回大于或等于自变量且等于数学整数的最小(最接近负无穷大

  • 问题内容: 我想将双精度值四舍五入到2个小数点。 例如:我有双d = 2;结果应为result = 2.00 问题答案: 内部表示形式在2和2.00之间没有差异。您可以使用四舍五入的值到最接近的整数- 使该轮为2位小数,你可以乘100,圆形,再除以100,但你不应该期望的结果是 准确 2DPS,由于二进制浮点运算的性质。 如果您只想将值 格式化 为两位小数,请查看-如果您对 计算中 的小数位数感兴