浮动和双重 - 我应该使用哪一个?

Anonim

(注意:本文假设读者了解计算机科学的基础知识)

许多注册计算机科学的新手程序员/学生会询问与他们学习的计算机科学中的特定领域相关的常见问题。大多数初学者课程都以现代计算机中使用的数字系统的主题开始,包括 二进制 , 十进制 , 八进制 和 十六进制 系统。这些是计算机数字格式,它们是计算机(或计算器和任何其他类型的数字计算机)中数值的内部表示。这些值存储为“位组”。

正如我们所知,计算机以二进制数字组的形式表示数据(即,在组合中 1秒0, 如, 1111 代表 15 在十进制系统中),教导用于表示动态值范围的不同数字格式是有意义的,因为它们构成了任何类型操作中的计算/数字处理的基本块。一旦在教室中定义了数字系统(通常很差),学生就会想要转移到相同类型的不同数字格式(即, 浮点运算 )具有一定的精度和数字范围。因此,他们被迫学习某些类型之间的细微差别。两种最常用的数据类型是 浮动 ,虽然他们针对相同的需求(即, 浮点运算 ),它们的内部表示和对程序计算的总体影响有很大差异。遗憾的是,许多程序员错过了Flat和Double数据类型之间的细微差别,并最终在不应该首先使用它们的地方滥用它们。最终导致计划其他部分的计算错误。

在本文中,我将使用C编程语言中的代码示例告诉您float和double之间的区别。让我们开始吧!

Float vs Double ……这笔交易是什么?

Float和Double是用于浮点算术运算的数据表示,考虑您在数学类中计算的十进制数,例如, 20.123, 16.23, 10.2等等,它们不是整数(即 2, 5, 15等等,因此它们需要考虑二进制中的分数。作为结果的十进制数(即, 20.123, 16.23等等,不能用普通的二进制格式(即整数)来表示。 Float和Double的主要区别在于前者是单精度(32位)浮点数据,而后者是双精度(64位)浮点数据类型。 Double被称为“double”,因为它基本上是Float的双精度版本。如果你正在计算一个巨大的数量(想想数字中的数千个0),那么Double中的不准确性会更小,你不会失去太多精确度。

最好使用代码示例进行详细说明。以下是通过C语言提供的数学函数对Float和Double的操作:

#包括

int main(){

float num1 = 1.f / 82;

float num2 = 0;

for(int i = 0; i <738; ++ i)

num2 + = num1;

printf(“%。7g n”,num2);

double num3 = 1.0 / 82;

double num4 = 0;

for(int i = 0; i <738; ++ i)

num4 + = num3;

printf(“%。15g n”,num4);

的getchar();

}

它打印以下内容:

9.000031

8.99999999999983

在这里,您可以看到Float和Double精度的细微差别完全给出了不同的答案,尽管Double似乎比Float更准确。

以下是C中sqrt()函数的示例:

#包括

#包括

int main(){

float num1 = sqrt(2382719676512365.1230112312312312);

double num2 = sqrt(2382719676512365.1230112312312312);

printf(“%f n”,num1);

printf(“%f n”,num2);

的getchar();

}

它给出了以下输出:

48813108.000000

48813109.678778

在这里,您可以看到Double中的答案具有更好的精度。

总而言之,最好使用Double进行浮点运算,因为C中的几个标准数学函数在Double和现代计算机上运行,​​对于双浮点计算来说非常快速和高效。这导致减少使用Float的需要,除非你需要操作大量的浮点数(想想数字中有数千个0的大型数组),或者你在不支持双重数据的系统上运行 - 精度浮点,许多GPU,低功耗设备和某些平台(ARM Cortex-M2,Cortex-M4等)不支持Double,那么你应该使用Float。另外,要记住的一件事是某些GPU / CPU在浮点处理中工作得更好/更有效,就像在矢量/矩阵的计算中一样,因此您可能需要查看硬件规范手册/文档以更好地决定应该使用哪一个对于特定的机器。

在针对现代计算机的代码中,很少有理由使用Float而不是Double。Double中的额外精度减少但不能消除可能导致程序其他部分出现问题的舍入错误或其他不精确的可能性。许多数学函数或运算符转换并返回Double,因此您不需要将数字转换回Float,因为这可能会失去精度。有关浮点运算的详细分析,我强烈建议您阅读这篇很棒的文章(http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html)。

摘要

所以……简而言之:

你应该使用Float的地方:

  • 如果您的目标是硬件,其中单精度比双精度快。
  • 您的应用程序大量使用浮点运算,就像数以千计的数千个数字一样。
  • 您正在进行非常低级别的优化。例如,您正在使用一次操作多个数字/数组/向量的特殊CPU指令(即SSE,SSE2,AVX等)。

结论

在本文中,我强调了Float和Double之间的区别,以及哪一个应该在特定的地方使用。可以说,盲目地在大多数地方使用Double是更好的,特别是如果你的目标是现代计算机,因为使用双浮点运算导致效率低的可能性极小。如果您有任何疑问,可以在下面的评论部分询问!