2012-03-02 32 views
2

我用sizeof来检查我的64位和opteron机器的长裤和花车的尺码。这两种显示为4花车和长裤

当我检查limits.hfloat.h的最大浮动和长期价值,这些都是值我得到:

Max value of Float:340282346638528859811704183484516925440.000000 

Max value of long:9223372036854775807 

因为它们都具有相同的尺寸的,如何能浮店如此巨大的价值与长期相比?

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

+0

有些事情是不对的。如果'sizeof(long)== 4',那么'long'的最大值只应该是'2147483647'。 – Mysticial 2012-03-02 02:58:30

+0

只有32位长值是错误的。它应该只有约20亿。 – ldav1s 2012-03-02 03:00:37

+2

一些64位ABI具有32位长和64位长 - 其他都使用64位。 – Perry 2012-03-02 03:06:16

回答

6

这是一个折衷。

一个32位带符号整数可表达和2 -1 -2之间的每个整数。

32位浮点数使用指数表示法,可以表示更大范围的数字,但无法表示范围内的所有数字 - 甚至不能表示所有整数。它使用一些比特来表示分数,其余的则用来表示指数。它实际上就是6.023 * 10 这样的符号的二进制等价物,或者你有什么,在范围末端的可表示数字之间的距离相当大。

欲了解更多信息,我会读这篇文章,“什么每台计算机科学家应该知道关于浮点运算”,由大卫·戈德堡:你的平台上http://web.cse.msu.edu/~cse320/Documents/FloatingPoint.pdf

顺便说一句,我希望一个单精度浮点数一个32位的数量和一个长为64位的数量,但这与整体关系并不密切。

性能在这里很难定义。取决于操作的性质以及是否使用硬件加速,浮点操作可能会或可能不会比整数操作花费更长的时间。一般来说,像加法和减法这样的操作在整数上要快得多 - 乘法和除法操作都少得多。在某一时刻,人们在进行计算时试图让每一次循环出局,都会将实数表示为“定点”算术,并用整数来表示它们,但这种技巧现在更为罕见。 (在你使用的Opteron上,浮点运算实际上是硬件加速的。)

几乎所有运行C的平台都有不同的“float”和“double”表示形式,其中“double”float是双精度,即占用比特两倍的表示。除了空间折衷之外,对这些操作的操作往往会稍微慢一些,而且如果计算精度不需要双打,那么人们对性能的高度关注又会尝试使用浮点数。

0

浮点数学本身就是一个主题,但是:int类型通常比浮点类型快。

要记住的一个技巧是,并非所有的值都可以表示为浮点数。 例如最接近你可能达到1.9是1.899999999。这导致有趣的错误,你说如果(v == 1.9)的东西意外行为!

+0

我正在使用的情况是,我只使用整数(不是十进制数字)。我需要表示比整数长的数字。只要走这条路,理想的路就是。但由于某种原因,当我使用longs时,我正在使用的库崩溃..但它使用浮动时工作正常。所以我试图用浮标来代替多头。漂浮者会错过任何机会存储整个数字吗? – 2012-03-02 03:07:57

+0

任何给定的API调用将只使用一种类型的数字。如果您想知道为什么当您输入错误类型的数据时它会崩溃,那么我建议您可能不了解C类系统的工作方式 - 可能需要花一些时间阅读它,因为这是不是唯一会遇到麻烦的地方。 – Perry 2012-03-02 03:09:28

+0

@TheFlyingDutchman:术语很重要。你不需要表示比*整数长的数字(没有这样的数字),你需要表示比'int'更长的数字。 'int'是几个整数类型之一。 “长”是另一个。 – 2012-03-02 03:39:00

0

如果是这样,这是否会影响性能:即使用long比使用float更快?

是的,与long s的算术会比float s更快。

我假设他们有不同的浮点存储表示。

是的。 float类型为IEEE 754(单精度)格式。

既然它们都是相同的大小,那么浮点数与long相比如何存储这么大的值呢?

它被优化为在几个点(例如接近0)处存储数字,但未优化为准确。例如,您可以添加1到1000000000.与float,可能不会有任何差异(1000000000而不是1000000001),但与long会有。

+0

这并不一定是“长”算术比“浮点”算术更快的情况。有些系统针对浮点进行了大量优化。 – 2012-03-02 03:34:42

+0

@Keith Thompson,真的,但我猜测OP的AMD Opteron不是其中之一。 – ldav1s 2012-03-02 03:40:46

1

long上的操作是否比float上的操作快,反之亦然,这是不太可能的。

如果您只需要表示整数值,请使用整数类型。您应该使用哪种类型取决于您使用的类型(有符号还是无符号,shortint对比longlong long<stdint.h>中的精确宽度类型之一)。

如果需要表示实数,请使用浮点类型之一:float,doublelong double。 (float除非内存空间是非常珍贵的其实是不常用; double具有较好的精度,通常是不超过float慢。)

总之,选择一个类型,其语义匹配你需要什么,并担心以后的表现。迅速找到错误答案并没有什么好处。

至于存储表示,其他答案已经涵盖了很多。通常,无符号整数用于表示值,有符号整数用于表示符号的一位(尽管通常不直接),而浮点类型用于标志的一位,指数的几位,其余为价值。 (这是一个过分简单化)。