简单问题:数字1.15507e-173的正确位表示是什么,双精度? 完整的问题:如何确定正确解析此数字?
背景:我的问题来自this answer,它显示了来自三个不同解析器的两种不同的位表示,即
0x1c06dace8bda0ee0
和
0x1c06dace8bda0edf
我想知道哪个解析器已经正确。
更新 the C99 specification的第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()的行为与内置解析器的行为基本相同。感谢那些指出这一点的回答者。
另见this answer类似问题和this blog。
答案 0 :(得分: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
鉴于两者都偏离同一侧,因此正确的表示是第一个。