C中的双重计算器

时间:2014-03-31 21:30:05

标签: c

我有一个用C编写的非常简单的双打计算器。它很简单,一个5岁的孩子可以做到。但是,我坚持到最后返回的数字。使用long类型的double变量,脚本会运行,但在中间,脚本会打印&#34; 4611686018427387904&#34;,然后&#34; -9223372036854775808&#34;,然后是0,直到for循环停止重复。< / p>

#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;
}

如果将双精度类型更改为int(并更改print语句中的参数类型),则代码返回正确的数字,然后打印&#34; 1073741824&#34;,然后&#34; - 2147483648&#34;,然后为0,直到循环用完。

如果你将double的类型更改为float并更改参数类型,则代码打印正确,然后&#34; 170141183460469231731687303715884105728.000000&#34;,然后&#34; inf&#34;对于循环的其余部分。

为什么这样做?我的猜测是你只能在y个字节中填充x长度的数字(4个用于int,8个用于long)do到二进制的限制。 32 1和0适合4个字节,64 1和0适合8个字节。该理论中的缺陷是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个字节

长度:8字节

浮动的大小: 4个字节

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

1 个答案:

答案 0 :(得分:1)

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

+/- mantisse ^ exponent

(^是数学。“power”,不是二进制“xor”)。

如果不是2的权力,则不会准确保存大数字 (如10000000000000000000000和10000000000000000000001
不会在浮动方面产生影响,它将是1000000 ......某事) 因为实际价值的空间有限 但它可以用它的指数模糊地代表这么大的数字。

问题是,转换为int想要确定它的确切值,
并且不适合4字节。