gpt4 book ai didi

c++ - 日志功能不当行为!!!有什么线索吗?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:50 24 4
gpt4 key购买 nike

我正在用 C 语言编写一些程序。它有一部分会做一些概率计算,我在其中使用对数函数。普通库函数 log()...

代码是这样的

double somevalue = 0.29558101472995091;
temp = log(somevalue)

你猜怎么着?温度得到值 -1856.0000000000000!!!

由于 log 的值在某个结构中,我也编写了这个测试代码,并得到了相同的结果......

int main()
{
double somevalue;
double temp;

somevalue = 0.29558101472995091;
temp = log(somevalue);
return 0;
}

Results:
Somevalue = 0.29558101472995091
temp = -1856.0000000000000

是不是很疯狂。任何人都知道这里发生了什么。

我为此使用 Visual Studio 2005。我现在无法使用其他编译器。

谢谢,

微内核:)

最佳答案

您需要 #include <math.h>所以编译器会调用 log()正确。

使用 VC10,我从 printf ("log(%lf) = %lf\n", somevalue, temp ) 得到以下结果什么时候math.h包括:

log(0.295581) = -1.218812

如果math.h不包括在内,我得到:

log(0.295581) = -1856.000000

可能发生的情况是编译器期望调用 log() 的返回值成为int然后转换为 double存储在 temp .我不知道编译器是如何返回浮点结果的,但我猜它们是在 FP(0) 寄存器中返回的,而 int 结果是在 EAX 中返回的(假设 x86 Win32 平台)。因此,在这种情况下,编译器获得的值甚至可能与 log() 的值没有任何关系。函数尝试返回。

如果将警告级别设置为 /W3您会收到有关该问题的警告:

C:\TEMP\test.c(10) : warning C4013: 'log' undefined; assuming extern returning int

在我看来,除非你正在使用一个没有利用函数原型(prototype)的非常古老的代码库,否则将警告转化为错误可能很有意义(当然,当编译为 C++ 时,这已经是一个错误):

#pragma warning( error : 4013) // or use the `/we4013` compiler option

这是可编译的测试:

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

int main()
{
double somevalue;
double temp;

somevalue = 0.29558101472995091;
temp = log(somevalue);

printf ("log(%lf) = %lf\n", somevalue, temp);

return 0;
}

关于c++ - 日志功能不当行为!!!有什么线索吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3514302/

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