cmath's pow() 在 GCC 中的正确性
Correctness of cmath's pow() in GCC
Code [GCC,使用 -O2 标志编译]
int main()
{
vector< vector<int> > matrixa(8);
int ff = 5;
int s = pow(ff, matrixa.size());
int ss = pow(double(ff), int(matrixa.size()));
vector< vector<int> > comb(s);
cout << ff << "^" << matrixa.size() << " = " << s << endl;
cout << ss << endl;
return 0;
}
输出
5^8 = 390624
390625
我想知道为什么s = 390624
什么时候应该390625
.如果我编译没有 -O2 标志的代码,那么s = 390625
.此外,ss
的铸造似乎纠正了这个问题。
这是怎么回事?
我的操作系统是Windows 7 Ultimate x64。不确定 GCC 版本,它带有代码::块 10.05。
因为浮点运算并不完美,当你这样做时
int s = pow(ff, matrixa.size());
pow
的结果实际上更像是390624.99999
,当你截断它以int
它有效地扁平化为390624。如果你期望那里有一个整数值(一个带有 .0 小数部分的浮点数(,你可能应该对 pow
的结果四舍五入。
尝试将结果分配给double
并输出它(可能具有更大的std::setprecision
(设置。您将看到,由于舍入误差,该值将类似于390624.99999999999
(或类似(。
转换为 int 会截断小数部分,从而留下390624
.使用std::round
获得所需的结果。
相关文章:
- 代理对象的常量正确性
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 奇怪的结构&GCC&clang(void*返回类型)
- GCC本机矩阵运算库
- PowerPC ppc64le上的Gcc Woverloaded虚拟错误
- gcc和c++17的过载解析失败
- 数据成员SFINAE的C++17测试:gcc vs clang
- GCC对可能有效的代码抛出init list生存期警告
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- 使用gcc从静态链接的文件中查找可选符号
- 普通环路未使用gcc 4.8.5自动矢量化
- 有了gcc,是否可以链接库,但前提是它存在
- 在clang++预处理器中确定gcc工具链版本
- 为什么 gcc 编译这个而 msvc 没有
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- cmath's pow() 在 GCC 中的正确性