Fortran Coder

标题: t是 时间,mod是什么意思?请问这个式子是什么意思呢? [打印本页]

作者: 王二小    时间: 2018-5-2 05:41
标题: t是 时间,mod是什么意思?请问这个式子是什么意思呢?
if (mod(t, 50)==0)
作者: fcode    时间: 2018-5-2 08:05
mod(a,b) 是求 a 对 b 的余数。
作者: SSLATELE    时间: 2021-4-27 10:42
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
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
布衣龙共 发表于 2021-4-27 15:23
mod 是如下定义:
   mod(A,B) = A - int(A/B) * B
而 modulo 是如下定义:

谢谢老师指点,我再去研究一下
作者: dfct    时间: 2021-4-27 16:47
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
GCC-gfortran 对 modulo 的定义是和 mod 一样的。故而不适合楼主。
此时,应该自己书写 modulo 函数

[Fortran] 纯文本查看 复制代码
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
谢谢两位老师,我用的是intel的编译器,我发现用公式A - int(A/B) * B 或 A - floor(A/B) * B 都可以得到0.0,看来mod是要谨慎一些使用,我现在直接采用公式的方法来计算




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2