我使用sizeof来检查我的64
位amd opteron机器中long和float的大小。两者都显示为4。
当我检查limits.h
和float.h
的最大浮点数和长值时,这些是我得到的值:
Max value of Float:340282346638528859811704183484516925440.000000
Max value of long:9223372036854775807
由于它们都具有相同的大小,因此与long相比,float如何存储如此巨大的值?
我假设他们对float有不同的存储表示。如果是这样,这是否会影响性能:即使用浮动比使用浮动更快?
答案 0 :(得分:6)
这是一种权衡。
32位有符号整数可以表示-2 31 和+2 31 -1之间的每个整数。
32位浮点数使用指数表示法,可以表示更宽范围的数字,但无法表达范围内的所有数字 - 甚至不能表示所有整数。它使用一些位来表示分数,其余用来表示指数。它实际上是二进制等价的符号,如6.023 * 10 23 或者你有什么,可表示数字之间的距离在范围的末端非常大。
有关更多信息,请阅读David Goldberg撰写的文章“每个计算机科学家应该知道的关于浮点运算的内容”:http://web.cse.msu.edu/~cse320/Documents/FloatingPoint.pdf
顺便说一下,在你的平台上,我希望浮点数是一个32位数量,一个长数据是64位数量,但这与整体点并不是真的密切相关。
在这里很难定义性能。浮点运算可能会或可能不会比整数运算花费更长的时间,具体取决于运算的性质以及是否使用硬件加速。通常,加法和减法等运算在整数乘法和乘法中要快得多。在某一点上,人们在进行计算时试图将每个周期都烧掉,将实数表示为“定点”算术,并使用整数来表示它们,但现在这种技巧更为罕见。 (在Opteron上,例如你正在使用的,浮点运算确实是硬件加速的。)
几乎所有C运行的平台都有不同的“float”和“double”表示,“double”浮点数是双精度,即占用两倍位数的表示。除了空间权衡之外,对它们的操作通常有些慢,而且,如果计算精度不要求双倍,那么高度关注性能的人会尝试使用浮点数。
答案 1 :(得分:1)
long
上的操作是否比float
上的操作更快,反之亦然。
如果您只需要表示整数值,请使用整数类型。您应该使用哪种类型取决于您使用的类型(已签名与未签名,short
与int
对比long
与long long
或其中一个<stdint.h>
)中的精确宽度类型。
如果您需要表示实数,请使用以下某种浮点类型:float
,double
或long double
。 (float
实际上并没有太多用处,除非内存空间非常宝贵; double
具有更高的精度,通常不会慢于float
。)
简而言之,选择一个语义匹配您需要的类型,并在以后担心性能。快速得到错误的答案并不是很有利。
至于存储表示,其他答案几乎涵盖了这一点。通常无符号整数使用它们的所有位来表示值,有符号整数用一位来表示符号(虽然通常不直接),浮点类型为符号专用一位,为指数专用几位,其余为为了价值。 (这是一个粗略的过度简化。)
答案 2 :(得分:0)
浮点数学本身就是一个主题,但是:int类型通常比float类型快。
要记住的一个技巧是并非所有值都可以表示为浮点数。 例如你最接近1.9的可能性是1.899999999。这会导致有趣的错误,你说if(v == 1.9)事情出乎意料!
答案 3 :(得分:0)
如果是这样,这是否会影响性能:即使用浮动比使用浮动更快?
是的,使用long
s的算术比使用float
s更快。
我假设他们有一个不同的浮动存储表示。
是。 float
类型采用IEEE 754(单精度)格式。
由于它们都具有相同的大小,因此与long相比,float如何存储如此巨大的值?
它被优化为在几个点(例如,接近0)存储数字,但它没有被优化为准确。例如,您可以添加1到1000000000.使用float
,总和可能没有任何差异(1000000000而不是1000000001),但是long
会有。