gpt4 book ai didi

c - gclib 的强制转换问题

转载 作者:行者123 更新时间:2023-11-30 16:23:17 26 4
gpt4 key购买 nike

我在编写测试程序时发现了这一点。我想知道这个问题出在哪里。是在 C 库 (printf)、clang 编译器还是 Mac 处理器中?我在 Mac 上使用 clang 编译了这个程序。这是简短的程序:

#include <stdio.h>

int main(void) {

int num = 12;
double temp = 0.0;

temp = num/10.0;
printf("%lf\n", temp);
temp = temp - 1.0;
printf("%lf\n", temp);
temp = temp * 10.0;
printf("%lf\n", temp);
int new_num = temp;
printf("%d\n", new_num);
int cast_num =(int)temp;
printf("%d\n", cast_num);

return 0;
}

该程序适用于所有数字,除了 num 以 12 结尾的情况。当 num 以 12 结尾时。new_num 和cast num = 1 而不是应有的 2。如果将 num 设置为 22,则 new_num 和cast_num = 2 应该如此。如果 num = 11,10,13,14 等,甚至可以按预期工作...当 num 以 12 结尾时,它不起作用。因此设置 num = 212,并将第 10 行替换为 temp=temp-21。并且会发生不正确的结果。将 num 更改为 213,它会按预期工作。

有人知道这个问题的本质吗?奇怪的是它只显示以 12 结尾的数字。

有什么想法吗?

Apple LLVM 版本 10.0.0 (clang-1000.10.44.4)目标:x86_64-apple-darwin18.2.0线程模型:posix

最佳答案

这是因为舍入问题。 2.000000 并不总是 2!

尝试以下操作:

temp = temp * 10.0;
printf("%.20lf\n", temp);

您可能会观察到,该温度低于 2。因此,强制转换为 int 会将其四舍五入为 1。

问题是,已经 1.2 (12/10.0) 无法精确表示为 float ,因此第一个除法已经不完全是 1.2,而是有点较少的。此错误会向下传播,直到您进行强制转换。要解决此问题,请在将其转换为 int 之前使用 round() 在数学上进行正确舍入。

关于c - gclib 的强制转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54039077/

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