如何判断一个双精度浮点数是否能安全地存储为单精度浮点数?

4

可能重复:
实数-如何确定需要浮点数还是双精度?

我正在尝试检查将双精度转换为浮点数是否会导致精度损失。显然,我可以进行转换,然后将浮点数转换回双精度并将其与原始值进行比较。我想知道是否有更直接的方法。


相关链接:http://stackoverflow.com/questions/11772776/how-are-double-precision-floating-point-numbers-converted-to-single-precision-fl - NominSim
答案就在这里,如果你做一点数学:https://dev59.com/6m435IYBdhLWcg3w-1V_ - Richard A.
请澄清一下,什么是安全的?您总是会丢失一些位;如果只有它们全部设置为0时才丢失这些位,您认为这样做是否安全? - MSalters
你应该询问的问题不是你是否会失去精度,而是你会失去足够的精度以至于有影响。大多数浮点数开始表示不准确的数量,并且大多数数学计算的结果最终都会舍入到某个点,无论是为了图形显示目的而将其舍入为像素坐标或RGB值,还是为了数值显示目的而将其舍入到某些数字位数等等。根本问题是早期舍入是否会给结果增加不可接受的不确定性,超出已经存在的不确定性。 - supercat
2个回答

9
转换为float类型再转回来通常是最高效的解决方案;在大多数常见的架构上,它只需要几个指令,每个指令的延迟时间都只有几个周期。这种方法不仅简单而且正确。
在没有浮点数硬件支持的平台上,你可以通过拆分数字并检查指数和有效位是否适合于单精度来更有效地进行检查,但这是一个相对不常见的边界情况,而且这种方法更容易出错,也不能移植到使用不同FP格式的平台。

0
浮点数有两个部分,即尾数和指数。双精度浮点数在这两个部分上分配了更多的位数。将双精度浮点数赋给浮点数会丢失尾数位,从而使您获得更少的精度数字,这是可以预料的。但是,如果双精度浮点数的指数不适合浮点数的指数,则浮点数将成为垃圾值。

3
如果双精度指数不适合浮点数指数,那么浮点数将成为垃圾值。将指数过低的“double”转换为“float”应该给出0。(如果一些有效数字位仍然可以在“float”的子正规化表示中表示,则为子正规化)。将指数过高的“double”转换应该给出+inf或-inf。 - Pascal Cuoq
从来不知道。谢谢! - brian beuning

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接