Fortran中内部函数fraction()的输出错误

时间:2014-12-29 09:20:18

标签: floating-point fortran

我不理解FRACTION()的输出,例如

write(*,*) fraction(553.334)

它给了我0.5403652

我认为它应该返回0.334,就像553.334-floor(553.334)那样。我的理解有什么问题?

4 个答案:

答案 0 :(得分:8)

Au contraire ,该值恰好(在可用精度范围内)正确答案。我认为错误是你误解了fraction的作用。要解释标准(在线广泛使用,许多教程和其他指南),fraction(x)将返回x模型表示的小数部分。在大多数现代计算机上,x的模型表示形式是x*2^-k的一些形式。实际上,对于示例x,函数返回的数字553.034/1024 == 553.034*2^-10除以下一个最高幂2。

与计算机一样,RTFM(阅读Fortran手册)。

答案 1 :(得分:7)

fraction()没有按照您的想法行事。它返回型号(基数2)的小数部分。所以对于你的例子,它正在返回:

553.334/1024 = 0.5403652

与往常一样,如有疑问,请阅读the documentation

答案 2 :(得分:0)

快速解决方法:

real(kind(1.d0))元素函数fractional_part(x)!双精度   实(种类(1.d0)),意图(IN):: X

FRACTIONAL_PART = X-地板(x)的

结束函数fractional_part

如果要将其用作重载模块过程,可以使用新的“内在”来查找real(4),real(8)的小数部分,以及支持的实数(16)。< / p>

答案 3 :(得分:-1)

标准中的描述是&#34; fraction(x)返回x的小数部分。&#34;但是WG5标准中的例子是分数(3.0) - > 0.75,与set_exponent(x,0)相同。

因此,自Fortran 95以来所有标准中的简短描述都是错误的。实际操作与set_exponent(x,0)相同。

我认为WG5 for Fortran 2020的适当行动是定义&#34; fraction(x)&#34; as x-floor(x)用于类型为real(4),real(8)的参数,如果支持,则为real(16),并注意set_exponent(x,i)已经提供了混乱和混乱的结果I = 0。如果已经这样,请修复文档。