c - 花车和多头

标签 c memory

我使用 sizeof 检查我的 64 位 amd opteron 机器中 long 和 float 的大小。两者都显示为 4。

当我检查 limits.hfloat.h 的最大 float 和 long 值时,这些是我得到的值:

Max value of Float:340282346638528859811704183484516925440.000000

Max value of long:9223372036854775807

既然它们的大小相同,那么与 long 相比,float 怎么能存储这么大的值呢?

我假设他们对 float 有不同的存储表示。如果是这样,这是否会影响性能:即,使用 long 比使用 float 更快吗?

最佳答案

这是一个权衡。

一个 32 位有符号整数可以表示 -231 到 +231-1 之间的所有整数。

32 位 float 使用指数表示法,可以表达范围更广的数字,但无法表达该范围内的所有数字——甚至不能表达所有整数。它使用一些位表示分数,其余位表示指数。它实际上是 6.023*1023 等符号的二进制等价物,在范围的末端可表示数字之间的距离非常大。

有关更多信息,我会阅读 David Goldberg 撰写的这篇文章“每位计算机科学家应了解的浮点运算知识”:http://web.cse.msu.edu/~cse320/Documents/FloatingPoint.pdf

顺便说一下,在您的平台上,我希望 float 是 32 位的数量,而 long 是 64 位的数量,但这与整体点并不密切相关。

性能在这里很难定义。浮点运算可能会或可能不会比整数运算花费更长的时间,具体取决于运算的性质以及是否为其使用硬件加速。通常,像加法和减法这样的运算在整数中要快得多——乘法和除法就没那么快了。有一次,人们在进行计算时试图耗尽每个周期,将实数表示为“定点”算术并使用整数来表示它们,但这种技巧现在已经很少见了。 (在您使用的 Opteron 上,浮点运算确实是硬件加速的。)

几乎所有运行 C 的平台都有不同的“float”和“double”表示,“double”浮点是 double ,即占用两倍位的表示。除了空间权衡之外,对它们的操作通常有些慢,而且,如果计算精度不需要加倍,那么高度关注性能的人会尝试使用 float 。

关于c - 花车和多头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9527355/

相关文章:

c - 结构上的 memcpy 错误

c - 使用 malloc 的 MPI 动态数组

ios - 具有许多图像的 UITableView 内存使用率高

memory - 操作系统内存分配地址

ios - React-Native 大量内存使用和仅来自 flatlist iOS 的崩溃

c - 在函数中使用二维数组以及 C 中的字数统计

c - Linux 上的 0x4000000 sigaction 标志是什么?

C 程序无法识别从 MATLAB 导出的文件中的 '\n'

django - Heroku 上的内存监控

java - 简单的 Android 应用程序即将 OOM