浮动(float)和双人——我应该用哪一个?(double – which one should i use?)的区别

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

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

许多计算机科学专业的新手程序员/学生会问一些与他们所学的计算机科学领域相关的常见问题。大多数初级课程都是从现代计算机中使用的数制开始的,包括二进制、十进制、八进制和十六进制。这些是计算机数字格式,是计算机(或计算器和任何其他类型的数字计算机)中数值的内部表示形式。这些值存储为“位分组”。

正如我们所知,计算机用一组二进制数字来表示数据(即1和0的组合,例如,1111代表十进制中的15),因此,教授用于表示动态值范围的不同数字格式是有意义的,因为它们构成了任何操作中计算/数字处理的基本块。一旦在课堂上定义了数字系统(通常很糟糕),学生们就会倾向于使用同一类型(即浮点算术)中具有一定精度和数字范围的不同数字格式。因此,他们被迫学习某些类型之间的细微差别。最常用的两种数据类型是Float和Double,虽然它们的目标是相同的需求(即浮点运算),但它们的内部表示和对程序中计算的总体影响却有很大的不同。不幸的是,许多程序员错过了平面数据类型和双数据类型之间的细微差别,最终在不应该首先使用它们的地方误用了它们。最终导致项目其他部分的计算错误。

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

浮动(float) vs. 加倍…怎么回事?(double… what’s the deal?)

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

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

#包括<标准h>

int main(){

浮点数1=1.f/82;

浮点数m2=0;

对于(int i=0;我<738; ++(一)

num2+=num1;

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

双num3=1.0/82;

双num4=0;

对于(int i=0;我<738; ++(一)

num4+=num3;

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

getchar();

}

它打印以下内容:

9.000031

8.99999999999983

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

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

#包括<标准h>

#包括<数学.h>

int main(){

浮点数1=sqrt(2382719676512365.1230112312);

双num2=sqrt(2382719676512365.1230112312);

printf(“%f\n”,num1);

printf(“%f\n”,num2);

getchar();

}

它提供以下输出:

48813108

48813109.678778

在这里,你可以看到双精度的答案有更好的精度。

总之,浮点运算最好使用Double,因为C中的几个标准数学函数都是在Double上运行的,而现代计算机对双浮点运算的速度和效率都非常高。这就减少了对使用浮点的需求,除非您需要操作大量的浮点数(想想数字中有数千个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的位置:

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

结论

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

  • 发表于 2021-06-24 19:49
  • 阅读 ( 137 )
  • 分类:IT

你可能感兴趣的文章

包装类(wrapper class)和java中的基元类型(primitive type in java)的区别

...va是一种流行的编程语言,用于开发各种应用程序。Java的一个优点是它支持面向对象编程(OOP)。使用OOP,可以使用对象对程序或软件进行建模。类被用作创建对象的蓝图。有必要在编程中存储数据。存储数据的保留内存位置称...

  • 发布于 2020-10-19 06:27
  • 阅读 ( 748 )

整数(integer)和浮动(float)的区别

...装类。 目录 1. 概述和主要区别 2. 什么是整数 3. 什么是浮动 4. 整数与浮点的相似性 5. 并排比较-以表格形式显示整数与浮点 6. 摘要 什么是整数(integer)? Integer是Java中的一个包装类。对应的数据类型是int。它用于将int数据类型转...

  • 发布于 2020-10-19 08:34
  • 阅读 ( 756 )

浮动(float)和双重的(double)的区别

关键区别–浮动与双精度 在编程中,需要存储数据。数据存储在存储器中。存储数据的内存位置称为变量。每个内存位置都可以存储特定类型的数据。每种数据类型的内存大小不同。在Python等编程语言中,程序员不需要声明...

  • 发布于 2020-10-19 09:19
  • 阅读 ( 294 )

不同类型的局域网ip地址代表什么?

...天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由社区驱动的问答网站分组。 图片由CLUC(Flickr)提供。 问题 超级用户读者Flare Cat想知道不同类型的LAN IP地址代表什么?: I have seen LAN IP addresses in the fo...

  • 发布于 2021-04-09 22:09
  • 阅读 ( 244 )

如何将MicrosoftWord文档中的所有超链接恢复为默认的蓝色样式?

...的事情,不小心改变了我们正在处理的microsoftword文档中一个重要元素的样式。如果是小东西,修补起来可能很容易,但如果不是那么简单呢?今天的超级用户问答文章提供了一些快速简便的方法来帮助修补读者的microsoftword文档...

  • 发布于 2021-04-10 03:25
  • 阅读 ( 171 )

短密码真的那么不安全吗?

...p;A web sites. 问题 超级用户读者user31073很好奇他是否真的应该注意那些简短的密码警告: Using systems like TrueCrypt, when I have to define a new password I am often informed that using a short password is insecure and “very easy” to break by brute-force. I always u...

  • 发布于 2021-04-11 18:12
  • 阅读 ( 171 )

127.0.0.0和127.0.0.1有什么区别?

...天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由社区驱动的问答网站分组。 问题 超级用户阅读器Disa对环回IP很好奇: I know that both are loopback IPs, but they have another ip mask. What’s the difference between them? ...

  • 发布于 2021-04-11 21:41
  • 阅读 ( 184 )

本地ip地址和本地ip地址有什么区别?

...天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由社区驱动的问答网站分组。 问题 超级用户读者Diogo想知道为什么ping命令对localhost和本地IP地址的处理方式不同,而从表面上看,它们似乎是相同的: ...

  • 发布于 2021-04-12 00:27
  • 阅读 ( 270 )

我可以在没有可见命令提示符的情况下运行windows批处理文件吗?

...天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,是一个由社区驱动的问答网站分组。 问题 超级用户读者Jake想隐形运行BAT文件,他写道: I have installed a ruby gem called Redcar, which is launched from the command line. When it...

  • 发布于 2021-04-12 03:23
  • 阅读 ( 211 )

我应该通过软件或硬件来调整音量以获得最佳声音吗?

You can adjust the your speaker volume in-app, operating system-wide, or by the physical controls on your speaker setup. Which method is best for optimum sound? 今天的问答环节是由SuperUser提供的,SuperUser是Stack Exchange的一个分支,它是一个由Q&a网站组成的社区驱...

  • 发布于 2021-04-12 03:57
  • 阅读 ( 252 )
白寂孤影
白寂孤影

0 篇文章

相关推荐