Is fmod incorrect?
Is fmod incorrect?
给定以下双精度,fmod
是否返回正确的值?
double x = .090;
double y = .003;
double r = fmod(x, y);
// r = 0.0029999999999999949
为什么r不为0?
因为和大多数小数一样,这些数字不能用二进制浮点格式精确表示。查看实际使用的值:
#include <cstdio>
int main() {
printf("%.20f %.20fn", .090, .003);
}
Output: 0.08999999999999999667 0.00300000000000000006
这些小的舍入误差意味着第一个值略小于第二个值的精确倍数,因此您可以看到结果。
您可能希望允许较小的误差容限:
if (r > y - some_small_value) {
r = 0;
}
这类问题可以通过阅读题为每个计算机科学家应该知道的浮点运算的论文来解决。
您的机器对浮点数使用二进制表示,它不能准确地表示有理数3/1000=0.003。
当然,机器可以将其近似值0.003打印为"0.003"
,但这是通过printf
内的格式化打印代码来完成的,当它将值四舍五入到给定的小数位数时。
浮点值的打印、十进制版本与其实际内部值之间的差异可能会给没有意识到这些问题的程序员或用户带来问题。
相关文章:
- 在 Cocos2dx 中初始化粒子效果后的警告 - "libpng warning: iCCP: known incorrect sRGB profile"
- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- Using google-vr from the fmod c++ api
- VSCode 错误: "incorrect use of va_start"
- 系统调用失败"Incorrect Section Name -e" C++
- 如何使用 FMOD 和 C++ 显示当前音乐位置
- 我的游戏引擎的 FMOD 音频
- 双打的 fmod 问题
- 我如何检查 - 并使用 fmod(浮点数)获取余数
- 当构造函数为私有时,我如何动态创建fmod ::声音
- 如何将"fmod()"替换为整数"mod()"函数
- 了解 std::fmod 和 std::余数
- 没有匹配函数调用 FMOD::Studio::System::setListenerAttributes()
- GetTimeZoneInformation 函数返回具有"incorrect"值的结构
- MsiViewFetch "SELECT * FROM `Property`"成功,但返回"Incorrect function." C++
- 在FMOD Studio C 中保存FFT频谱
- 无法检测到FMOD中的体积
- FMOD EX内存分配问题
- FMOD对象指针
- Is fmod incorrect?