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