gpt4 book ai didi

c - 为什么在 C 中使用 log() 函数会得到不同的结果?

转载 作者:行者123 更新时间:2023-11-30 14:51:32 25 4
gpt4 key购买 nike

这是一个 log() 函数测试的简单示例:

#include <stdio.h>
#include <math.h>

int main(void)
{
int a = 2;
printf("int a = %d, log((double)a) = %g, log(2.0) = %g\n", a, log((double)a), log(2.0));
return 0;
}

我在 Raspberry Pi 3 和 Ubuntu16.04 上发现了差异:

arm-linux-gnueabi-gcc

$ arm-linux-gnueabi-gcc -mfloat-abi=soft -march=armv7-a  foo.c -o foo -lm
$ ./foo
int a = 2, log((double)a) = 5.23028e-314, log(2.0) = 0.693147

arm-linux-gnueabihf-gcc

$ arm-linux-gnueabihf-gcc -march=armv7-a  foo.c -o foo -lm
$ ./foo
int a = 2, log((double)a) = 0.693147, log(2.0) = 0.693147

海湾合作委员会

$ gcc foo.c -o foo -lm
$ ./foo
int a = 2, log((double)a) = 0.693147, log(2.0) = 0.693147

最佳答案

Raspbian 的标准发行版使用 Raspberry Pi ( Raspbian FAQ ) 的硬件浮点支持,该支持与使用软件库仅使用整数模拟浮点计算的不同方法不完全兼容。

您可以通过查找硬浮点版本的目录 /lib/arm-linux-gnueabihf/lib/arm-linux-gnueabihf 来判断 Raspbian 发行版的类型 ( How can I tell... ) 用于软 float 。

正如 Pascal Cuoq 在该问题的评论之一中指出的那样,了解所有示例中 log(2.0) 正确结果的原因可能会很有趣不断折叠。。如果可能的话,出于优化目的,允许编译器在编译时计算每个结果。例如,如果您的代码中有不同的舍入模式,这可能是一种不需要的行为。 GCC 有 -frounding-math 来切换常量折叠(除其他外),尽管它可能无法捕获所有内容,所以在这里要小心。

关于c - 为什么在 C 中使用 log() 函数会得到不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219079/

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