为什么 g++ -O3 不将除法改为乘法?
Why doesn't g++ -O3 change division to multiplication?
我以为g -o3会自动更改为乘法。但要累积此代码:
#include <iostream>
#include <sys/time.h>
double compute0(int i) {
double d_2 = i * i;
double ret = 0;
for (int j = 0; j < 1000000; j++) {
ret += j;
}
return ret;
}
double compute1(int i) {
double d_2 = i * i;
double ret = 0;
for (int j = 0; j < 1000000; j++) {
ret += j / d_2;
}
return ret;
}
double compute2(int i) {
double d_2 = i * i;
double d_2_inv = 1.0 / d_2;
double ret = 0;
for (int j = 0; j < 1000000; j++) {
ret += j * d_2_inv;
}
return ret;
}
double tik() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec * 1e-6;
}
int main() {
{
double begin = tik();
double ret = 0;
for(int i = 1; i < 100; i++)
ret += compute0(i);
double end = tik();
std::cout << "cost time: " << end - begin << " ret: " << ret << std::endl;
}
{
double begin = tik();
double ret = 0;
for(int i = 1; i < 100; i++)
ret += compute1(i);
double end = tik();
std::cout << "cost time: " << end - begin << " ret: " << ret << std::endl;
}
{
double begin = tik();
double ret = 0;
for(int i = 1; i < 100; i++)
ret += compute2(i);
double end = tik();
std::cout << "cost time: " << end - begin << " ret: " << ret << std::endl;
}
return 0;
}
输出为:
成本时间:0.105436 RET:4.95E 13
成本时间:0.453676 RET:8.17441E 11
成本时间:0.203873 RET:8.17441E 11
为什么?
编译器通常尝试遵循IEEE754。在此标准中,划分是准确定义的。这意味着,对于每个a/b
,都有一个脱颖而出的答案。如果将其修改为a*(1/b)
,结果可能会有所不同(您可能会看到此效果,如果您用16个重要数字打印双倍的双倍(
编译器通常可以选择放松。GCC具有-FFAST -MATH,VC具有/fp:fast。
相关文章:
- 在除法中不需要四舍五入
- 在TFHE(完全快速同态加密)上执行除法
- 使用 int 表示浮点除法 C++
- 而循环:简单的除法程序输出零,不明白为什么
- 余数除法和不允许除以零 (c++) 时遇到问题
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 如何使用除法和for_each?
- C++:奇怪的除法输出
- 分配给浮点数的积分文字除法 - 为什么结果是错误的?
- 除法函数返回错误的值
- 检查向量是否使用除法和阻抗算法进行排序
- 不使用算术运算符的除法
- C++编译器能在编译时计算出文字的除法结果吗
- 浮点 由于除法语句而导致的 c++ 异常
- 特征矩阵向量除法
- 在早期的 C 和 C++ 编译器中,手动位移位与乘法和除法的相关性如何?
- 用除法反转向量的元素
- 按运行时常量值重复整数除法
- 将 int 128 除法提升为浮点数
- 用于 3D 矢量的高效除法运算符