gpt4 book ai didi

c++ - 这个 GCC 优化不正确吗?

转载 作者:IT老高 更新时间:2023-10-28 13:00:18 25 4
gpt4 key购买 nike

我有一个仿函数,它接受一个值,将其转换为 double,获取日志并将值转换回原始类型。对于这个问题,原始和输出类型是 float 。这是原始的 C++ 代码:

return static_cast< TOutput >( std::log( static_cast< double >( A ) ) )

当我在 Debug模式下编译时,一切都按预期进行,GCC 调用底层 log 函数:

  51:/myfile.h ****     return static_cast< TOutput >( std::log( static_cast< double >( A ) ) );
219133 .loc 112 51 0
219134 0010 488B45F0 movq -16(%rbp), %rax # A, tmp64
219135 0014 F30F1000 movss (%rax), %xmm0 # *A_1(D), D.237346
219136 0018 0F14C0 unpcklps %xmm0, %xmm0 # D.237346, D.237346
219137 001b 0F5AC0 cvtps2pd %xmm0, %xmm0 # D.237346, D.237347
219138 001e E8000000 call log #
219138 00
219139 0023 660F14C0 unpcklpd %xmm0, %xmm0 # D.237347
219140 0027 660F5AC0 cvtpd2ps %xmm0, %xmm0 # D.237347, D.237346
219141 002b F30F1145 movss %xmm0, -20(%rbp) # D.237346, %sfp
219141 EC
219142 0030 8B45EC movl -20(%rbp), %eax # %sfp, <retval>

但是,当我打开优化 (-O2 -ggdb3 -DNDEBUG) 时,它会调用 logf (???) 函数:

  51:/myfile.h ****     return static_cast< TOutput >( std::log( static_cast< double >( A ) ) );
145171 .loc 64 51 0
145172 01a0 F30F1004 movss (%rdx,%rax,4), %xmm0 # MEM[(const float &)_84], MEM[(const float &)_84]
145172 82
145173 01a5 E8000000 call logf #

它给出了不同的输出。这是正常的吗?我做错什么了吗?在我看来,GCC 对我的代码采取了一种非常自由的解释,如果没有 -ffast-math 选项,我不会期望这种解释。

最佳答案

将 double log应用到float的转换转换为单精度应用的float是一种边界优化>log,但可以说是可以接受的。

假设 logf 被正确四舍五入,并且 double log 也被正确四舍五入或至少忠实地四舍五入,这两个计算几乎不会有差异。由于double-rounding,它们可能不同(对于一些罕见的输入) (其中“double”表示“两次”,不指类型)。与最终类型的有效数字相比,在中间类型的有效数字中有额外的数字,双舍入在统计上的重要性较低(从数学的角度来看,这个统计论点有点垃圾,但它“在实践中有效”的函数没有被设计成反例)。出于教学原因,人们(或维基百科)用一个或两个额外的精度来解释它,但是当你有 53 - 24 = 29 个额外的二进制数字时,它可能会发生在 229.

我对优化感到惊讶,如果我自己编写代码以详尽搜索 log 的双舍入问题,我会对此感到不安,但考虑到 C++ 标准没有从 std::log 要求任何级别的准确性,可以认为它“不是错误”。


如果我们讨论的不是 log,而是基本操作之一(例如 *),那么对于编译器来说,转换是不正确的声称在引入可见更改时提供 IEEE 754 语义。对于基本操作,精度由 IEEE 754 间接规定,规范没有变化的余地。

碰巧对于基本操作,当 floatOP(flx,fly) 替换 (float)doubleOP((double)flx, (double)fly )(这个 thesis 在第 6 章中演示了这一点),但是当类型是 doublelong double 时可能会有明显的差异。这个确切的错误是recently fixed斯蒂芬·佳能在 Clang 中。

关于c++ - 这个 GCC 优化不正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26584903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com