Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 浮动和多头_C_Memory - Fatal编程技术网

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吗