C++ 在计算比 b 大得多的 a 的 mod(a,b) 时,std::fmod 如何避免舍入错误

KMo*_*Mot 5 c++ algorithm math mod

我有一个小函数来计算 mod 如下:

double mod(double a, double b){
  return a-floor(a/b)*b;
}
Run Code Online (Sandbox Code Playgroud)

mod(1e15,3) 正确返回 1,但 mod(1e16,3) 由于乘法中的数值舍入错误而返回 0。但是使用 std::fmod(1e16,3) 可以正常工作并返回 1。有谁知道他们是如何避免这个问题的?