我最近注意到double
或long double
中的一个变量具有相同的精度:15位数字。我读到在x86/x64上,长双精度应该至少有20位数字。
怎么了?有什么问题吗?
#include <stdio.h>
int main() {
long double u = 1.23456789012345678901234567890123456789;
double v = (double)u;
float w = (float)u;
printf("%fn%lfn%Lfn", w, v, u);
printf("%.20fn%.20lfn%.20Lfn", w, v, u);
}
这里的输出:
1.234568
1.234568
1.234568
1.23456788063049316406
1.23456789012345669043
1.23456789012345669043
C标准不要求long double
比double
具有任何额外的精度,只是它至少具有相同的精度。本C11标准草案(附件F(:
F.2类型
- C浮动类型与IEC 60559格式匹配如下:
float
类型与IEC 60559单一格式相匹配double
类型与IEC 60559双格式相匹配long double
类型与IEC 60559扩展格式匹配,否则为非IEC 60559扩展格式,否则为IEC 60559双格式
用于长双类型的任何非IEC 60559扩展格式应具有更多精度是IEC 60559的两倍,至少在IEC 60559范围内双重
这篇文章的关键部分是我在第三个子要点和最后一段中大胆强调的部分。
此外,英特尔x86/x64体系结构对扩展精度浮点运算没有内在的支持,因此实现这些运算的任何编译器都必须通过"自制"库(如英特尔©C/C++编译器提供的库(来实现。
#include <stdio.h>
int main() {
long double u = 1.23456789012345678901234567890123456789;
double v = (double)u;
float w = (float)u;
printf("%fn%lfn%Lfn", w, v, u);
printf("%.20fn%.20lfn%.20Lfn", w, v, u);
printf("%.40Lfn",u); /* print out the long double not limiting it to 20 places */
};
请告诉我你想要的更多。。。