t是 时间,mod是什么意思?请问这个式子是什么意思呢?
if (mod(t, 50)==0) mod(a,b) 是求 a 对 b 的余数。 fcode 发表于 2018-5-2 08:05mod(a,b) 是求 a 对 b 的余数。
老师你好,请问 a = mod(39.0_8,0.39_8) 为啥不是0,a已经定义为双精度了,结果是0.389999....... SSLATELE 发表于 2021-4-27 10:42
老师你好,请问 a = mod(39.0_8,0.39_8) 为啥不是0,a已经定义为双精度了,结果是0.389999....... ...
mod 是如下定义:
mod(A,B) = A - int(A/B) * B
而 modulo 是如下定义:
modulo(A,B) = A - floor(A/B) * B
因此,你要得到 0.0,建议用 modulo
a = modulo(39.0_8,0.39_8) 布衣龙共 发表于 2021-4-27 15:23
mod 是如下定义:
mod(A,B) = A - int(A/B) * B
而 modulo 是如下定义:
谢谢老师指点,我再去研究一下:-victory: modulo 也不能保证能得到 0.0
A - int(A/B) * B 和 A - floor(A/B) * B 应该是数学意义上的表达式
不同的编译器的具体表现不一样,
我试了 intel 的编译器 modulo(39.0_8,0.39_8) = 0.0
但 mingw modulo(39.0_8,0.39_8) 跟 mod(39.0_8,0.39_8) 结果一样都不是 0.0
所以实数因为舍入误差的问题,mod 运算需要特别的小心 GCC-gfortran 对 modulo 的定义是和 mod 一样的。故而不适合楼主。
此时,应该自己书写 modulo 函数
program hello
Print *, moduu(39.0_8,0.39_8)
contains
real(8) Function moduu(a,b)
real(8) :: a , b
moduu = A - floor(A/B) * B
end function
end program Hello 谢谢两位老师,我用的是intel的编译器,我发现用公式A - int(A/B) * B 或 A - floor(A/B) * B 都可以得到0.0,看来mod是要谨慎一些使用,我现在直接采用公式的方法来计算
页:
[1]