【问题标题】:String of numbers to double in c [duplicate]在c中加倍的数字字符串[重复]
【发布时间】:2018-07-12 03:49:10
【问题描述】:

我正在尝试将 c 中的简单字符串转换为双精度:

 double n;
 sscanf_s(str, "%lf", &n);
 printf("%lf", n);

考虑到:

const char *str[] = {"37107287533902102798797998220837590246510135740250"};

当我尝试打印 n 时,直到第 16 位数字都很好。输出是这样的:

371072875339021043110257403....

可能是什么问题?

【问题讨论】:

  • 因为 C 中的浮点类型的精度有限(double-precision IEEE-754 约为 15-17 位)。 Double precision - decimal places。在某些平台上,您可以使用long double 来获得更多数字,尽管Decimal Precision Lost after 15th Digit - Bad PI
  • 因为浮点数有点像科学记数法。您的数字在内部表示为相当于 3.710728753390210 x 10^49 的二进制数,而尾数中您只能得到小数点后约 15 位。
  • 在普通机器上的普通编译器下没有任何类型可以让您以全精度表示像 37107287533902102798797998220837590246510135740250 这样的数字。 (该数字至少需要 165 位。​​)您必须使用单独的任意精度库。

标签: c string char double


【解决方案1】:

2 个问题:

sscanf_s(str, "%lf", &n); 需要 char *,而不是 char **。启用所有编译器警告以查看此类问题并确保正确剪切/粘贴问题。

const char *str[] = {"37107287533902102798797998220837590246510135740250"};  

您的意思是以下吗?

const char *str = {"37107287533902102798797998220837590246510135740250"};

double 通常可以完全编码大约 264 个不同的值,因为 double 通常是 64 位数据。
37107287533902 102798797998220837590246510135740250不是其中之一。

如下输出是合理的:
37107287533902 1043110257403....

37107287533902 104311025740304689820495323650000000.0是最接近的可表示double

37107287533902 099118728881769862191964827320000000.0 将是下一个最佳选择。

注意在这个范围内,精确 double 相距 2112(大约 5.2*1033)。这就是大多数double 编码的二进制性质。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多