c++ fmod 为 fmod(0.6,0.2) 返回 0.2

标签 c++ floating-accuracy fmod

当我在 C++ 中使用 fmod(0.6,0.2) 时,它返回 0.2

我知道这是由浮点精度引起的,但现在看来我必须得到两个双倍的余数

非常感谢对此类问题的任何解决方案

最佳答案

数学值 0.60.2 无法用二进制 float 精确表示。

这个演示程序会告诉你发生了什么:

#include <iostream>
#include <iomanip>
#include <cmath>
int main() {
    const double x = 0.6;
    const double y = 0.2;
    std::cout << std::setprecision(60)
              << "x          = " << x << "\n"
              << "y          = " << y << "\n"
              << "fmod(x, y) = " << fmod(x, y) << "\n";
}

我的系统(很可能是你的)的输出是:

x          = 0.59999999999999997779553950749686919152736663818359375
y          = 0.200000000000000011102230246251565404236316680908203125
fmod(x, y) = 0.1999999999999999555910790149937383830547332763671875

根据您传递给它的参数,fmod() 返回的结果是正确的。

如果您需要一些其他结果(我假设您期望的是 0.0),您将不得不做一些不同的事情。有多种可能性。您可以检查结果是否与 0.2 相差非常小,或者您可以使用整数算法进行计算(例如,如果您处理的所有数字都是 0.10.01)。

关于c++ fmod 为 fmod(0.6,0.2) 返回 0.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447548/

相关文章:

c++ - 为什么我会收到此警告? "Member ' x' 未在此构造函数中初始化”

c++ - 声明嵌套结构的指针

floating-point - 浮点不准确示例

c++ - 增加 float 值

c# - Sound.readData 和 Sound.lock 在 FMOD 上的区别?

c++ - 我应该使用 const 来使对象线程安全吗?

C 编码,比较浮点值时的意外行为

c - 余数 (x,y) 真的是 x-((round(x/y)*y) 吗?

windows - 在FMOD中播放和收听录音设备

c++ - 无法打印存储在 vector C++ 中的结构内容