繁体   English   中英

除数时如何存储C中的所有浮点值

[英]How to store all the floating value in C when dividing the number

在正常的 C 语言中,当除以一个数字时,结果数字是浮点值,但它在浮点后仅显示 6 个小数位我想将小数点后的所有浮点数存储在一个数字中我该怎么做这个例子:一般 22/7 = 3.142857142857142857....
但是 C 语言只存储 3.142857 如何存储浮点后出现的所有数字。

考虑十进制浮点格式。 浮点格式表示具有数字序列的数字,例如 3142857,以及告诉我们将小数点放在哪里的指数,即 3.142857。 鉴于此,我们可以看到您的计算机不可能存储所有 22/7 的十进制数字,因为有无限多的数字,但您的计算机只有有限数量的 memory。 即使该格式存储了一百万位数字,也不足以存储 22/7 的所有数字。

floatdouble常用的格式是二进制浮点格式。 它们存储一系列二进制数字(位)和一个指数(和一个符号,+ 或 -)。 因此,除了只有有限的位数外,它们还会偏离十进制格式。 例如,虽然 3/10 可以用十进制格式精确表示,但我们用float表示它为 1.0011001100110011001101 2 ⋅2 -2 = 5,033,165 / 16,777,216 = 0.300000011920928955078125。

一般来说,由于各种理论原因,在计算机中进行完美的实数算术也是不可能的,尽管您可以从这样一个事实开始,即实数的无穷类型大于无穷大的类型数字字符串的数量。

通过记录分子和分母以将每个数字表示为分数,可以编写对有理数进行算术运算的软件。 然而,与所有数学一样,计算机仍然有有限的限制,所以理性算术只能在有限的范围内完成。

对于大多数目的,如果结合知识和技能使用double算术就足够了。 您可以通过显式请求打印更多 22/7 数字,例如printf("%.16g\n", 22./7); .

但是 C 语言仅存储 3.142857是什么意思? C 存储的远不止这些,看看你可以在 c 中存储多大的数字?

浮点数有一个指数(8 位 IEEE-754 标准浮点数,11 位双精度数)和一个尾数(分别为 23 和 52 位浮点数和双精度数)

只需使用正确的格式说明符打印值:

#include <stdio.h>

int main(void)
{
    printf("%f\n", 22. / 7);    // output --> 3.142857
    printf("%.25f\n", 22. / 7); // output --> 3.1428571428571427937015414
    return 0;
}

或询问可以打印而不会丢失精度的小数位数:

#include <stdio.h>
#include <float.h>

int main(void)
{
    printf("%.*g\n", DBL_DECIMAL_DIG, 22. / 7);
    return 0;
}

Output:

3.1428571428571428

即使您使用的是袖珍计算器,也不是显示器上的所有数字实际上都是“重要的”。 浮点数被比作海滩上的一小堆泥土:“每次你捡起一个并移动它,你就会捡起一点泥土,失去一点沙子。” 除了指数之外,每个浮点表示都有一定数量的数字可以表示,但您需要了解数学的实际执行方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM