Fortran Coder

查看: 17574|回复: 10
打印 上一主题 下一主题

[通用算法] 负数求三次方根的NaN问题,多谢啦!

[复制链接]

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

楼主
发表于 2015-9-30 07:35:17 | 显示全部楼层
本帖最后由 楚香饭 于 2015-9-30 07:36 编辑

由于浮点数有误差。所以 1.0/3.0 并不能精确的表示 1/3,例如可能是 0.333333334,极大可能是一个偶数分之一。
你知道,负数开偶次方会是 NaN 对吧?

所以,如果要开三次方,比较好的办法,是先取绝对值,开方以后,再把符号乘上去。(sign函数可以返回符号,即1.0或-1.0)

以下代码在三个编译器上测试,均能得到正确结果。

[Fortran] 纯文本查看 复制代码
Program www_fcode_cn
  Implicit None
  real(8) :: d = -1.63899782385934d-24 , s
  s = sign(1.0d0,d)*abs(d)**(1.0d0/3.0d0)
  write(*,*) s , d , s*s*s
End Program www_fcode_cn
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-16 08:19

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表