我使用sizeof检查我的64
位和opteron机器中的长度和浮子的大小.两者都显示为4.
当我检查limits.h
并float.h
获得最大浮点数和长值时,这些是我得到的值:
Max value of Float:340282346638528859811704183484516925440.000000
Max value of long:9223372036854775807
Run Code Online (Sandbox Code Playgroud)
由于它们都具有相同的尺寸,因此与长形相比,浮动如何存储如此巨大的价值?
我假设他们有一个不同的浮动存储表示.如果是这样,这是否会影响性能:即使用浮动比使用浮动更快?
这是一种权衡.
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"浮点数是双精度,即占用两倍位数的表示.除了空间权衡之外,对它们的操作通常有些慢,而且,如果计算的精度不要求双精度,那么高度关注性能的人会尝试使用浮点数.