Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中,从浮动到双浮动的铸造是如何工作的+;?_C++_Floating Point_Floating Accuracy_Floating Point Precision - Fatal编程技术网

C++ 在C+中,从浮动到双浮动的铸造是如何工作的+;?

C++ 在C+中,从浮动到双浮动的铸造是如何工作的+;?,c++,floating-point,floating-accuracy,floating-point-precision,C++,Floating Point,Floating Accuracy,Floating Point Precision,float变量中的尾数位总计为23位,而double变量中的尾数位总计为53位 这意味着可以用 一个float变量总共是log10(2^23)=6.92368990027=6 通过一个double变量log10(2^53)=15.9545897702=15 让我们看看这段代码: float b = 1.12391; double d = b; cout<<setprecision(15)<<d<<endl; double b = 1.12391; doubl

float
变量中的尾数位总计为23位,而
double
变量中的尾数位总计为53位

这意味着可以用

一个
float
变量总共是
log10(2^23)=6.92368990027=6

通过一个
double
变量
log10(2^53)=15.9545897702=15

让我们看看这段代码:

float b = 1.12391;
double d = b;
cout<<setprecision(15)<<d<<endl;
double b = 1.12391;
double d = b;
cout<<setprecision(15)<<d<<endl;
打印
1.12391


有人能解释为什么我得到不同的结果吗?我将一个6位数的浮点变量转换为双精度变量,编译器必须知道这6位数很重要。为什么?因为我没有使用更多不能在浮点变量中正确表示的数字。因此,它决定打印其他内容,而不是打印正确的值。

浮点值转换为
双精度值将保留该值。因此,在第一个代码段中,
d
精确地包含了112391/100000的
float
精度的近似值。Rational112391/100000以
float
格式存储为9428040/223。如果执行此除法,结果正好是1.1239099502565634765625:
float
近似值不是很接近
cout从
float
转换为
double
将保留该值。因此,在第一个代码段中,
d
精确地包含了112391/100000的
float
精度的近似值。Rational112391/100000以
float
格式存储为9428040/223。如果执行此除法,结果正好是1.1239099502565634765625:
float
近似值不是很接近<代码>cout 浮动b=1.12391

问题就在这里,这里:

双b=1.12391

这些作业已经不精确了。因此,使用它们进行计算或转换也将不精确

浮动b=1.12391

问题就在这里,这里:

双b=1.12391


这些作业已经不精确了。因此,使用它们进行计算或转换也将是不精确的。

您错误地认为前6位数字将是完全相同的。当我们说浮点值精确到6位(十进制)以内时,我们的意思是实际值和预期值之间的相对差值小于10-6。因此,1.12390995和1.12391相差0.0000005。这比你可以依赖的10-6要好得多。

你错误地认为前6位数字将完全相同。当我们说浮点值精确到6位(十进制)以内时,我们的意思是实际值和预期值之间的相对差值小于10-6。因此,1.12390995和1.12391相差0.0000005。这比可以依赖的10-6要好得多。

如果将double的有效位计算为53位,则float为24位。或者,如果您谈论的是显式有效位,则使用双52和浮点23。@AK_u您链接到的文档不包含问题的答案。你读过吗?不明白为什么这个问题被否决了。@AK_uu不,你的两个评论都不能被描述为与这个问题相关。只要你不是从1979年开始为克雷计算机编译,就完全有可能预测问题中的每个片段的作用。戈德伯格的报告并不是最好的信息来源。首先,它只描述了抽象的浮点,而不是它与C++的关系,它是现代、广泛的编译器(我不是说C++授权IEEE 754,只是它是一个罕见的编译器,没有实现它)。如果你把双的重要性作为53位,那么浮点就是24。或者,如果您谈论的是显式有效位,则使用双52和浮点23。@AK_u您链接到的文档不包含问题的答案。你读过吗?不明白为什么这个问题被否决了。@AK_uu不,你的两个评论都不能被描述为与这个问题相关。只要你不是从1979年开始为克雷计算机编译,就完全有可能预测问题中的每个片段的作用。戈德伯格的报告并不是最好的信息来源。首先,它只描述了抽象的浮点,而不是它与C++的关系,它是现代、广泛的编译器(我不是说C++授权IEEE 754,只是它是一个罕见的编译器,没有实现它)。实际上,问题中的“Log10(2 ^ 23)”计算是错误的。但不管怎样,应用log10的全部目的是为了获得一些十进制数字(而且值得尊敬的人已经这样做了,所以这不是一个坏主意)。如果你想在句子“相对差值小于10^-n”中使用你得到的数字n(如果你做得正确,则为7),你最好首先保留你得到的2^-24。实际上,问题中的“log10(2^23)”计算是错误的。但不管怎样,应用log10的全部目的是为了获得一些十进制数字(而且值得尊敬的人已经这样做了,所以这不是一个坏主意)。如果你打算在句子“相对差值小于10^-n”中使用你得到的数字n(如果你做得正确,则为7),你最好首先保留你得到的2^-24。