
如图所示

一般怎么实现 23 行里 FORCE_EVAL ,这种避免编译器优化的语句;空语句 x+toint 的用意何在?
24 行,为什么要写 return 0 * u.f ,而不写成 return 0 ;
26 行,为什么要写成 y = x + toint - toint - x; 而不写成 y = (x - x) + (toint - toint);
1 learningman 2023 年 1 月 27 日 不知道,但是我知道这是 C |
2 tool2d OP @learningman 哈哈,有道理,可惜主题已经不能编辑了。 |
3 Nugine0 2023 年 1 月 27 日 via Android 应该是浮点误差相关的优化(但我用不上) |
4 xtreme1 2023 年 1 月 27 日 1. 检测算数溢出 2. 0 * NaN = NaN; 0 * INF = NaN 3. y = int(x) - x |
5 kkkbbb 2023 年 1 月 27 日 超出了我能力范畴。。。 |
6 lcdtyph 2023 年 1 月 27 日 via iPhone 避免编译器优化可以用 volatile access |
7 zzz22333 2023 年 1 月 27 日 via Android 看下反汇编,一切都知道了 |
9 wangweixvan 2023 年 1 月 27 日 1. 用内联汇编 `__asm__ __volatile__ ("" : "+r" foo)`; 设置浮点异常状态; 2. 区分正零和负零; 3. 先加一个很大的数,使精度减少,恰好保留到整数,然后减去很大的数,得到原数的整数部分,最后减去原数,就得到原数的小数部分; 浮点运算不满足交换律或结合律。 |
10 pipapa 2023 年 1 月 28 日 和浮点数编码相关吧,很少用 |
11 MoRanjiang 2023 年 1 月 28 日 |
12 iOCZ 2023 年 1 月 28 日 @MoRanjiang 老师:我也不会这个 |
13 kice 2023 年 1 月 29 日 via Android 浮点位运算 hack ,掏出 IEEE 754 对着看位操作了什么的就行。这里的函数比起那 1/sqrt(x)好理解一些。 如果没有特殊要求,尽量使用标准库的浮点数函数。 阻止编译器优化的实现可以看看 google/benchmark 的 DoNotOptimize 和 ClobberMemory 。具体用法可以看看 cppcon 的一个演讲: https://github.com/google/benchmark/blob/a3235d7b69c84e8c9ff8722a22b8ac5e1bc716a6/include/benchmark/benchmark.h#L431 |