如图所示

一般怎么实现 23 行里 FORCE_EVAL ,这种避免编译器优化的语句;空语句 x+toint 的用意何在?
24 行,为什么要写 return 0 * u.f ,而不写成 return 0 ;
26 行,为什么要写成 y = x + toint - toint - x; 而不写成 y = (x - x) + (toint - toint);
|  |      1learningman      2023-01-27 18:00:56 +08:00 不知道,但是我知道这是 C | 
|  |      2tool2d OP @learningman 哈哈,有道理,可惜主题已经不能编辑了。 | 
|  |      3Nugine0      2023-01-27 18:13:42 +08:00 via Android 应该是浮点误差相关的优化(但我用不上) | 
|  |      4xtreme1      2023-01-27 18:25:05 +08:00 1. 检测算数溢出 2. 0 * NaN = NaN; 0 * INF = NaN 3. y = int(x) - x | 
|  |      5kkkbbb      2023-01-27 18:59:09 +08:00 超出了我能力范畴。。。 | 
|  |      6lcdtyph      2023-01-27 19:42:53 +08:00 via iPhone 避免编译器优化可以用 volatile access | 
|      7zzz22333      2023-01-27 19:44:15 +08:00 via Android 看下反汇编,一切都知道了 | 
|      8framlog      2023-01-27 23:15:01 +08:00 1. 搞个 mlock 之类的找个内存访问下 2. 不知道- - 3. 处理溢出吧。 | 
|  |      9wangweixvan      2023-01-27 23:55:10 +08:00  7 1. 用内联汇编 `__asm__ __volatile__ ("" : "+r" foo)`; 设置浮点异常状态; 2. 区分正零和负零; 3. 先加一个很大的数,使精度减少,恰好保留到整数,然后减去很大的数,得到原数的整数部分,最后减去原数,就得到原数的小数部分; 浮点运算不满足交换律或结合律。 | 
|  |      10pipapa      2023-01-28 00:08:41 +08:00 和浮点数编码相关吧,很少用 | 
|  |      11MoRanjiang      2023-01-28 03:05:37 +08:00 | 
|      12iOCZ      2023-01-28 12:01:18 +08:00 @MoRanjiang 老师:我也不会这个 | 
|      13kice      2023-01-29 03:27:27 +08:00 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 |