加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正确实施strtod?

发布时间:2020-12-16 06:57:09 所属栏目:百科 来源:网络整理
导读:简单的问题:1.15507e-173的正确位表示是什么,双精度? 完整的问题:如何确定正确解析此数字? 背景:我的问题从this answer开始,它显示了来自三个不同解析器的两个不同的位表示,即 0x1c06dace8bda0ee0 和 0x1c06dace8bda0edf 我想知道哪个解析器已经正确.
简单的问题: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.

解决方法

:= num1 = ImportString[".1c.06.da.ce.8b.da.0e.e0","Real64",ByteOrdering->1] // First;
:= num2 = ImportString[".1c.06.da.ce.8b.da.0e.df",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

鉴于两者都偏离同一侧,因此正确的表示是第一个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读