gpt4 book ai didi

c - getfloat 返回 23.7999

转载 作者:行者123 更新时间:2023-12-01 15:00:30 26 4
gpt4 key购买 nike

#define MAXBUF 1000
int buf[MAXBUF];
int buffered = 0;
int bufp = 0;

int getch()
{
if(bufp > 0) {
if(!--bufp)
buffered = 0;

return buf[bufp];
}
else {
buffered = 0;
return getchar();
}

}

void ungetch(int c)
{
buf[bufp++] = c;
buffered = 1;
}

int getfloat(float *pn)
{
int c, sign, sawsign;
float power = 1.0;

while(isspace(c=getch()))
;

if(!isdigit(c) && c!= '+' && c!= '-' && c != '.') {
ungetch(c);
return 0;
}

sign = (c == '-') ? -1 : 1;

if(sawsign = (c == '-' || c == '+'))
c = getch();

if(c != '.' && !isdigit(c)) {
ungetch(c);

if(sawsign)
ungetch((sign == -1) ? '-' : '+');

return 0;
}

for(*pn = 0.0; isdigit(c); c = getch())
*pn = 10.0 * *pn + (float)(c - '0');

if(c == '.')
while(isdigit(c = getch())) {
*pn = 10.0 * *pn + (float)(c - '0');
power *= 10.0;
}

*pn *= sign;
*pn /= power;

ungetch(c);
return c;
}

当我输入 23.8 时,它总是返回 23.7999,我不知道为什么。谁能告诉我为什么?

最佳答案

数字以 2 为底表示,而以 2 为底的浮点值不能准确表示每个以 10 为底的十进制值。您输入的内容为 23.8被转换为其最接近的等效基数 2 值,该值不完全是 23.8。当您打印出这个近似值时,它被打印为 23.7999 .

您还在使用 float ,这是最小的浮点类型,只有 24 位精度(大约 7 位十进制数字)。如果切换到 double ,精度位数是 float 的两倍多,所以十进制值(例如 23.8)与其 double 之间的差值代表性要小得多。这可能允许打印例程更好地执行舍入,以便您看到 23.8double .但是,变量中的实际值仍然不完全是 23.8。

作为一般建议,除非您有大量的浮点值(使内存使用成为您的主要关注点),否则最好使用 double每当您需要浮点类型时。你不会摆脱所有奇怪的行为,但你会看到比 float 更少的行为。 .

关于c - getfloat 返回 23.7999,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2017167/

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