gpt4 book ai didi

c++ - 为什么我得到 std::exp 的平台特定结果?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:43 24 4
gpt4 key购买 nike

<分区>

我有一个程序在 Android 和 Windows 下给出了截然不同的结果。当我根据包含预期结果的二进制文件验证输出数据时,即使差异很小(舍入问题)也很烦人,我必须找到一种方法来修复它。

这是一个示例程序:

#include <iostream>
#include <iomanip>
#include <bitset>

int main( int argc, char* argv[] )
{
// this value was identified as producing different result when used as parameter to std::exp function
unsigned char val[] = {158, 141, 250, 206, 70, 125, 31, 192};

double var = *((double*)val);

std::cout << std::setprecision(30);

std::cout << "var is " << var << std::endl;
double exp_var = std::exp(var);
std::cout << "std::exp(var) is " << exp_var << std::endl;
}

在 Windows 下,使用 Visual 2015 编译,我得到输出:

var is -7.87234042553191493141184764681
std::exp(var) is 0.00038114128472300899284561093161

在 Android/armv7 下,使用 g++ NDK r11b 编译,我得到输出:

var is -7.87234042553191493141184764681
std::exp(var) is 0.000381141284723008938635502307335

所以从 e-20 开始结果是不同的:

PC:      0.00038114128472300899284561093161
Android: 0.000381141284723008938635502307335

请注意,我的程序做了很多数学运算,我只注意到 std::exp 对相同的输入产生了不同的结果……而且只对某些特定的输入值产生了不同的结果(没有调查是否这些值具有相似的属性),对于它们中的大多数,结果是相同的。

  • 这种行为是否有点“预期”,是否不能保证在某些情况下会产生相同的结果?
  • 是否有一些编译器标志可以解决这个问题?
  • 或者我是否需要四舍五入我的结果以在两个平台上以相同的方式结束?那么四舍五入的好策略是什么?因为如果输入 var 非常小,在 e-20 舍入 abritrary 会丢失太多信息?

编辑:我认为我的问题不是 Is floating point math broken? 的重复。我在两个平台上得到完全相同的结果,只有 std::exp 对于某些特定值会产生不同的结果。

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