gpt4 book ai didi

c - C 中的 double 计算器

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

我有一个用 C 语言编写的非常简单的 double 计算器。它是如此简单,一个 5 岁的 child 就可以做到。然而,我被它最后返回的数字所困扰。使用 long 类型的 double 变量,脚本会运行,但在中间,脚本会打印“4611686018427387904”,然后打印“-9223372036854775808”,然后打印 0,直到 for 循环停止重复。

#include <stdio.h>

int main()
{
long doubles = 1;
int counter;
for(counter = 1; counter < 200; counter++) {
doubles = doubles * 2;
printf("%li\n", doubles);
}
return 7;
}

如果将 double 类型更改为 int(并更改 print 语句中的参数类型),则代码将返回正确的数字,但随后会打印“1073741824”,然后是“-2147483648”,然后是 0,直到循环已用完。

如果将 double 类型更改为 float 并更改参数类型,则代码将正确打印,然后是“170141183460469231731687303715884105728.000000”,然后是循环其余部分的“inf”。

为什么会这样做?我的猜测是,您只能在 y 字节中容纳 x 长度的数字(4 表示 int,8 表示 long),以达到二进制的限制。 4 个字节包含 32 个 1 和 0,8 个字节包含 64 个 1 和 0。该理论的缺陷在于 int 变量和 float 变量具有相同的字节数,如以下代码所示。

#include <stdio.h>

int main()
{
int integer;
long longVariable;
float floatingPoint;
printf("Size of int: %lu bytes\nSize of long: %lu bytes\nSize of float: %lu bytes\n", sizeof(integer), sizeof(longVariable), sizeof(floatingPoint));
return 7;
}

此代码打印:

int 大小:4 字节

long 的大小:8 字节

浮点大小:4 字节

这使得我之前的理论无效,因为在我的理论中,如果分配的二进制空间相同,则 float 的计数不应高于 int。到底发生了什么?!

最佳答案

float/double 的构建方式与整数类型不同。
int 是直接的二进制数,可能带有符号。
浮点变量有第三部分,即指数,因此有效值为

+/- mantisse ^ exponent

(^ 是数学“幂”,而不是二进制“异或”)。

如果不是 2 的幂,大数字将无法准确保存
(如 10000000000000000000000 和 10000000000000000000001
不会对 float 产生影响,它将是 1000000...某事)
因为实际值的空间有限。
但它可以用它的指数模糊地表示如此大的数字。

问题是,转换为 int 想要得到它的精确值,
这不适合 4 个字节。

关于c - C 中的 double 计算器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22772558/

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