V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tool2d
V2EX  ›  C++

假期快结束了,有个 C++难题,看看多少人会。

  •  
  •   tool2d · 2023-01-27 17:52:31 +08:00 · 4293 次点击
    这是一个创建于 666 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如图所示

    • 一般怎么实现 23 行里 FORCE_EVAL ,这种避免编译器优化的语句;空语句 x+toint 的用意何在?

    • 24 行,为什么要写 return 0 * u.f ,而不写成 return 0 ;

    • 26 行,为什么要写成 y = x + toint - toint - x; 而不写成 y = (x - x) + (toint - toint);

    github 完整源代码

    13 条回复    2023-01-29 03:27:27 +08:00
    learningman
        1
    learningman  
       2023-01-27 18:00:56 +08:00
    不知道,但是我知道这是 C
    tool2d
        2
    tool2d  
    OP
       2023-01-27 18:03:08 +08:00
    @learningman 哈哈,有道理,可惜主题已经不能编辑了。
    Nugine0
        3
    Nugine0  
       2023-01-27 18:13:42 +08:00 via Android
    应该是浮点误差相关的优化(但我用不上)
    xtreme1
        4
    xtreme1  
       2023-01-27 18:25:05 +08:00
    1. 检测算数溢出
    2. 0 * NaN = NaN; 0 * INF = NaN
    3. y = int(x) - x
    kkkbbb
        5
    kkkbbb  
       2023-01-27 18:59:09 +08:00
    超出了我能力范畴。。。
    lcdtyph
        6
    lcdtyph  
       2023-01-27 19:42:53 +08:00 via iPhone
    避免编译器优化可以用 volatile access
    zzz22333
        7
    zzz22333  
       2023-01-27 19:44:15 +08:00 via Android
    看下反汇编,一切都知道了
    framlog
        8
    framlog  
       2023-01-27 23:15:01 +08:00
    1. 搞个 mlock 之类的找个内存访问下
    2. 不知道- -
    3. 处理溢出吧。
    wangweixvan
        9
    wangweixvan  
       2023-01-27 23:55:10 +08:00   ❤️ 7
    1. 用内联汇编 `__asm__ __volatile__ ("" : "+r" foo)`;
    设置浮点异常状态;
    2. 区分正零和负零;
    3. 先加一个很大的数,使精度减少,恰好保留到整数,然后减去很大的数,得到原数的整数部分,最后减去原数,就得到原数的小数部分;
    浮点运算不满足交换律或结合律。
    pipapa
        10
    pipapa  
       2023-01-28 00:08:41 +08:00
    和浮点数编码相关吧,很少用
    MoRanjiang
        11
    MoRanjiang  
       2023-01-28 03:05:37 +08:00
    开学就要 C 考试了,你这个题目给我吓坏了。
    不过想想老师并不会考这么难,我决定继续摸鱼。
    iOCZ
        12
    iOCZ  
       2023-01-28 12:01:18 +08:00
    @MoRanjiang 老师:我也不会这个
    kice
        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
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   920 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:41 · PVG 05:41 · LAX 13:41 · JFK 16:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.