确定是否可以用float/double格式精确表示数字

apo*_*pse 4 c# floating-point

如何确定一个数字,例如1.577,是否可以用float或double格式精确表示?

这意味着它是真正的1.577而不是1.566999999999994324等.

编辑:我正在寻找一个工具,我可以在其中键入一个数字,它将显示它的双/浮点表示.所以这不仅仅是c#相关的问题.

Ric*_*gan 18

您可以使用在线十进制到浮点转换器.例如,键入1.577,您会得到两个不准确的指示:

1)选中"Inexact"框

2)双精度浮点数转换为1.5769999999999999573674358543939888477325439453125.

对比1.25这样的数字,打印为1.25,并且不检查"不精确"框.

(该转换器还可以检查单精度数字.)

  • @leppie:为了回应Mark所说的,转换器的主要目的不是打印像Burger和Dybvig,Steele和White或David Gay这样的圆形值.这就是让新手陷入困境的原因.它们输入0.1,机器打印回0.1.他们不知道内部,价值不是0.1.这就是我写这个工具的原因. (8认同)
  • @leppie:我认为这不是转换器的重点.它的目的是显示转换后的二进制浮点数的*exact*值(十进制,以及其他可能性),而不是Burger和Dybvig给出的(通常)近似值.使用Burger和Dybvig对于显示在转换为二进制时如何以十进制表示的一般值近似为目的有点无意义. (3认同)
  • @leppie:我做到了。有不止一种算法可以正确打印浮点数。 (2认同)

Pat*_*han 6

您已经有了关于如何明确检查精确表示的答案。此外,无需正式测试即可消除许多数字并立即检查短小数部分既可行又有用。

假设您的数字的十进制表示在 N 位小数后终止。例如,对于 1.577,N 为 3。取小数点后的部分,将其视为整数,577。如果该数字可以准确表示为二进制分数,则该部分必须是 5^N 的整数倍。577 不是 125 的整数倍,因此 1.577 不能完全表示。

如果你有一些合理的数量级,其十进制表示中只有几个有效数字,那么如果它通过了这个测试,它就完全可以表示了。例如,我知道在没有计算机化测试的情况下,1.625 是完全可以表示的。