为什么std::abs输出在MSVC2015上不正确
why std::abs output is incorrect on MSVC2015
我有不正确的结果从std::abs与MSVC和GCC
#include <cmath>
#include <iostream>
#include <complex>
int main()
{
std::cerr << std::sqrt((-6.)*(-6.) + 288.*288.) << "n";
std::cerr << std::abs( std::complex<float>(-6, 288) ) << std::endl;
return 0L;
}
以上代码在vc++ (MSVS 2015 CE与更新)和gcc 4.9.2上产生不同的结果
与MSVC288.062
288.063
与GCC 288.062
288.062
现在实际的结果是288.062,这在gcc上使用std::abs和std::sqrt是正确的。但是当使用std::sqrt和std::abs时,msvc有不同的结果,这可能是msvc2015中的一个bug。
但是看xcomplex的代码,我不理解_Fabs()的实现。有人能帮我理解这段具体的代码,并分析一下代码是如何以这样的错误结束的吗?
"现在实际结果是288.062[…]" -实际结果是288.06249...
,或类似的东西,不能用float
或double
精确地表示。
两个编译器实际上返回相同的值,您可以通过打印更多的数字来检查:
double re = -6, im = 288;
std::cout << "sqrt: " << 'n'
<< std::setprecision(6) << std::sqrt(re * re + im * im) << 'n'
<< std::setprecision(30) << std::sqrt(re * re + im * im) << 'n';
std::cout << "abs: " << 'n'
<< std::setprecision(6) << std::abs(std::complex<float>(im, re)) << 'n'
<< std::setprecision(30) << std::abs(std::complex<float>(im, re)) << 'n';
输出(使用VC 19.0和GCC 4.9.3):
sqrt:
288.062
288.062493219787313591950805858
abs:
288.062
288.0625
两个编译器实际上返回288.0625
为std::abs
1,但GCC输出288.62
(地板)和VC 288.063
(ceil) -这不是一个"问题"在std::abs
,但一个"问题"的方式输出格式化2。
1两个编译器都返回std::abs
的近似值,因为您正在使用std::abs
的float
,而您正在使用double
的std::sqrt
。将6.
和288.
替换为6.f
和288.f
或将std::complex<float>
替换为std::complex<double>
,您将获得与std::sqrt
和std::abs
相同的结果。
2据我所知,标准在使用std::ostream
时没有定义浮点值的舍入方式,实际规范来自printf
格式转换%f
,其中只有推荐一种舍入方式(我认为,这是gcc使用"四舍五入"的方式)。
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 关于类的 Python 文档 - 对C++的引用不正确
- 特征 LLT 模块给出不正确的结果?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- 如果语句逻辑不正确
- 来自逆 vp 矩阵和相机位置的光线方向不正确
- 不正确的操作数类型 MSVC
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 为什么除非我使用 cout,否则我的值不正确?
- 计算幂级数的数学结果不正确
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 为什么std::abs输出在MSVC2015上不正确