我不理解FRACTION()的输出,例如
write(*,*) fraction(553.334)
它给了我0.5403652
。
我认为它应该返回0.334
,就像553.334-floor(553.334)
那样。我的理解有什么问题?
答案 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。如果已经这样,请修复文档。