C 浮动和多头
在我的C 浮动和多头,c,memory,C,Memory,在我的64位amd opteron机器中,我使用sizeof来检查long和float的大小。两者都显示为4 当我检查limits.h和float.h的最大浮动和长值时,我得到的值是: Max value of Float:340282346638528859811704183484516925440.000000 Max value of long:9223372036854775807 既然它们都是相同大小的,那么一个浮点数与长点数相比怎么能存储如此巨大的值呢 我假设它们对float有不
64
位amd opteron机器中,我使用sizeof来检查long和float的大小。两者都显示为4
当我检查limits.h
和float.h
的最大浮动和长值时,我得到的值是:
Max value of Float:340282346638528859811704183484516925440.000000
Max value of long:9223372036854775807
既然它们都是相同大小的,那么一个浮点数与长点数相比怎么能存储如此巨大的值呢
我假设它们对float有不同的存储表示。如果是这样的话,这是否会影响性能:即,使用多头比使用浮动快吗?这是一种折衷
32位有符号整数可以表示-231和+231-1之间的每个整数
32位浮点使用指数表示法,可以表示更大范围的数字,但无法表示该范围内的所有数字,甚至不能表示所有整数。它使用一些位表示分数,其余的位表示指数。它实际上是一个二进制等价的符号,比如6.023*1023,或者你有过的其他符号,可表示数字之间的距离在范围的末端相当大
要了解更多信息,我会阅读David Goldberg的这篇文章,“每一位计算机科学家都应该知道的浮点算术知识”:
顺便说一句,在您的平台上,我希望浮点是32位的量,long是64位的量,但这与整体意义并不密切
这里很难定义性能。浮点运算可能需要也可能不需要比整数运算更长的时间,这取决于运算的性质以及是否使用硬件加速。通常,像加法和减法这样的运算在整数运算中要快得多,而乘法和除法运算则要慢得多。在某一点上,人们试图在进行计算时将每个周期都消耗掉,这会将实数表示为“定点”算术,并使用整数来表示它们,但这种技巧现在已经非常罕见了。(在Opteron上,如您正在使用的,浮点运算确实是硬件加速的。)
几乎所有运行C的平台都有不同的“float”和“double”表示,其中“double”float是双精度的,即占用两倍位的表示。除了空间折衷之外,对这些类型的操作通常会稍微慢一些,同样,高度关注性能的人会尝试使用浮点,如果他们的计算精度不需要双倍的话。浮点数学本身就是一门学科,但是的:int类型通常比浮点类型快 要记住的一个技巧是,并非所有值都可以表示为浮点。 e、 g.你可能能到达的最接近1.9的距离是1.89999999。这会导致有趣的bug,你会说如果(v==1.9)事情表现出人意料 如果是的话,这会影响性能吗:即,使用long是否比使用float更快 是的,
long
s的运算速度比float
s快
我假设它们对float有不同的存储表示
对。float
类型采用(单精度)格式
既然它们都是相同大小的,那么一个浮点数与长点数相比怎么能存储如此巨大的值呢
它的优化目的是将数字存储在几个点上(例如接近0),但它的优化目的不是为了精确。例如,您可以添加1到100000000。对于
float
,总和可能不会有任何差异(100000000而不是1000000001),但是对于long
则会有差异。对long
的操作是否比对float
的操作快,或者反之亦然,这不太重要
如果只需要表示整数值,请使用整数类型。您应该使用哪种类型取决于您使用它的目的(有符号与无符号、short
与int
与long
与long
,或
中的一种确切宽度类型)
如果需要表示实数,请使用浮点类型之一:float
、double
或long double
。(float
实际上没有太多使用,除非内存空间非常宝贵;double
具有更好的精度,并且通常不会比float
慢)
简言之,选择一个语义与您需要的匹配的类型,然后再考虑性能。快速得到错误答案并没有什么好处
至于存储表示,其他答案几乎涵盖了这一点。通常,无符号整数使用其所有位来表示值,有符号整数用一位表示符号(尽管通常不是直接表示),浮点类型用一位表示符号,几位表示指数,其余的表示值。(这是严重的过分简化。)有些地方不对劲。如果
sizeof(long)==4
,则long
的最大值应仅为2147483647
。只有32位的long值是错误的。它应该只有大约20亿。一些64位ABI有32位长和64位长,其他的则同时使用64位。这些最大值分别从float.h和limits.h打印出来。。现在我来研究一下,如果sizeof(long)=4,那么最长的最大值实际上是2147483647,并且您误解了限制的内容。h,可能将long的最大值误认为long的最大值。我使用的情况是,我只使用整数(而不是十进制数)。我需要表示比整数长的数字。这么长时间是理想的选择。但由于某些原因,当我使用long时,我正在使用的库崩溃了。。但是当它使用浮动时,它工作得很好。所以我试着用浮点数来代替长点数。浮点数有可能会错过整数的存储吗?有giv吗