5

简单的问题:双精度数字 1.15507e-173 的正确位表示是什么?完整的问题:如何确定这个数字的正确解析?

背景:我的问题来自这个答案,它显示了来自三个不同解析器的两个不同位表示,即

0x1c06dace8bda0ee0

0x1c06dace8bda0edf

我想知道哪个解析器做对了。

C99 规范的更新第 6.4.4.2 节说,对于 C 解析器,

"...the result is either the nearest representable value, or the larger
or smaller representable value immediately adjacent to the nearest
representable value, chosen in an implementation-defined manner."

这意味着解析的数字不需要是最近的,甚至不需要是两个相邻的可表示数字之一。7.20.1.3 中的相同规范说 strtod() 的行为方式与内置解析器基本相同。感谢指出这一点的回答者。

另请参阅类似问题的答案和此博客

4

1 回答 1

1
:= num1 = ImportString["\.1c\.06\.da\.ce\.8b\.da\.0e\.e0", "Real64", ByteOrdering->1] // First;
:= num2 = ImportString["\.1c\.06\.da\.ce\.8b\.da\.0e\.df", "Real64", ByteOrdering->1] // First;
:= SetPrecision[num1, Infinity]-numOr //N
:= numOr =  SetPrecision[1.15507, Infinity] * 10^-173;
             -190
= -6.65645 10
:= SetPrecision[num2, Infinity]-numOr //N
             -189
= -2.46118 10

Given that both deviate for the same side, it follows that the correct representation is the first one.

于 2011-08-03T10:37:49.317 回答