【发布时间】:2020-09-03 20:08:00
【问题描述】:
我相信 double 具有 x2 精度的 float 。
在我的计算器中,10/3 是 3.3333333333333333333333333333333
当我执行以下代码时:
#include <stdlib.h>
#include <stdio.h>
void main() {
double var = (double )10 / (double )3;
float var2 = (float )10 / (float )3;
printf("%f %f \n" , var , var2 );
}
我在 3 之后得到相同的位数,:
3.3333333333333335 3.3333332538604736
为什么我得到相同的位数?为什么价值不同?以及如何对 double 和 float 进行除法并获得 c 中的所有数字和数字(就像在我的计算器中一样)?
【问题讨论】:
-
您确实意识到 3.33333 中有无数个数字...如果您想要它们“全部”,这将需要一段时间。
-
因为
10/3不能用浮点变量精确表示。该代码不是打印10/3,而是尝试将其存储在具有有限存储空间的变量中的结果。您的计算器适合其显示所需的精度。 -
@WeatherVane 和其他人,好奇,你能详细说明一下吗? Windows 计算器显示 31 个“3”位小数。知道它是否使用某种比
double更大/更精确的内部数据类型?也许它有一个常用分数 ==> 十进制转换的查找表?我做了零研究。 -
@yano 必须优于
double,后者仅对 16 位有效数字有用。如果你想研究,现在是open source。 -
根据 C 2018 7.21.6.1 7,使用
%f的转换会在小数点后产生六位数字。如果你得到“3.3333333333333335”,那么要么你没有使用%f,要么你的C实现有缺陷。