【问题标题】:large numbers and float and double in CC中的大数和浮点数和双精度数
【发布时间】:2015-04-30 20:21:17
【问题描述】:

我需要处理非常大的矩阵和/或大量数字,但我不知道为什么 双倍结果 = 2251.000000 * 9488.000000 + 7887.000000 * 8397.000000; 给了我正确的输出 87584627.000000。 与 int 结果相同。

但是,如果我使用 float result = 2251.000000f + ... 等, 它给了我 87584624.000000 我不知道为什么!

谁能告诉我我错过了什么?

【问题讨论】:

  • 浮点数只有 23 位精度(在大多数平台上)。
  • 例如,vaughns-1-pagers.com/computer/powers-of-2.htm 显示的精度将略高于 6 位十进制数字,而问题中的总和为 8 位。
  • 这些不是很大的数字——你在 double 和 float 都可以表示的范围内。你说的是精度。有很多方法可以根据需要获得尽可能高的精度,但在去那里之前,您需要了解您是否真的存在精度不足的问题,或者您只是认为自己有。
  • 浮点数通过否定证明(你最喜欢的神/神)的存在,因为它们显然是(你最喜欢的邪恶拟人化)。分享和享受。
  • 浮点数没有 23 个二进制精度,它有 24 个(其中一个是隐式的)。这意味着可以表示的最大整数是 2^24 或 16777216(7 位以上)。下一个(较高的)整数是 24^2+2 或 16777218。上一个(较低的)整数

标签: c matrix floating-point double gpu


【解决方案1】:

C 中最常见的浮点数格式是 IEEE-754 格式,在 this wikipedia article 中进行了描述。 binary32 格式对应floatbinary64 格式对应double

float 的精度刚刚超过 7 位十进制数字。由于方程的答案有 8 位有效数字,因此答案不能准确地表示为 float

double 具有几乎 16 位十进制数字的精度,因此确实具有答案的精确表示。因此,一般来说,当你做通用数学时,你应该使用doubles。但是,重要的是要注意,即使是 double 也可能无法为每个应用程序提供足够的精度。例如,美国的国债是 18,149,752,816,959.61,这勉强适合double

【讨论】:

  • 还有long double,它通常有80(或128)位,可以精确表示所有有符号的64b整数:1b符号,15b指数,1b“标志”,63b小数。
  • @jschultz410 好点。我不愿推荐long double,因为它在不同系统中的标准化程度不是很好。与 doublefloat 几乎总是分别为 64 位和 32 位不同,long double 可以是 128、80 或 64 位,具体取决于系统。
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多