王二小 发表于 2018-5-2 05:41:00

t是 时间,mod是什么意思?请问这个式子是什么意思呢?

if (mod(t, 50)==0)

fcode 发表于 2018-5-2 08:05:42

mod(a,b) 是求 a 对 b 的余数。

SSLATELE 发表于 2021-4-27 10:42:23

fcode 发表于 2018-5-2 08:05
mod(a,b) 是求 a 对 b 的余数。

老师你好,请问 a = mod(39.0_8,0.39_8) 为啥不是0,a已经定义为双精度了,结果是0.389999.......

布衣龙共 发表于 2021-4-27 15:23:23

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)

SSLATELE 发表于 2021-4-27 15:38:22

布衣龙共 发表于 2021-4-27 15:23
mod 是如下定义:
   mod(A,B) = A - int(A/B) * B
而 modulo 是如下定义:


谢谢老师指点,我再去研究一下:-victory:

dfct 发表于 2021-4-27 16:47:34

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 运算需要特别的小心

布衣龙共 发表于 2021-4-28 08:09:45

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

SSLATELE 发表于 2021-4-28 17:14:46

谢谢两位老师,我用的是intel的编译器,我发现用公式A - int(A/B) * B 或 A - floor(A/B) * B 都可以得到0.0,看来mod是要谨慎一些使用,我现在直接采用公式的方法来计算
页: [1]
查看完整版本: t是 时间,mod是什么意思?请问这个式子是什么意思呢?