浮点算术运算的精度是多少?

2023-11-26

考虑下面两个非常简单的乘法:

double result1;
long double result2;
float var1=3.1;
float var2=6.789;
double var3=87.45;
double var4=234.987;

result1=var1*var2;
result2=var3*var4;

默认情况下,乘法的精度是否比操作数更高?我的意思是,在第一个乘法的情况下,它是以双精度完成的,而在 x86 架构中的第二个乘法的情况下,它是以 80 位扩展精度完成的,还是我们应该将表达式中的操作数转换为更高精度,如下所示?

result1=(double)var1*(double)var2;
result2=(long double)var3*(long double)var4;

其他运算(加、除、求余)呢?例如,当添加两个以上正单精度值时,如果用于保存表达式的中间结果,则使用双精度的额外有效位可以减少舍入误差。


浮点计算的精度

C++11 合并的定义FLT_EVAL_METHOD从 C99 开始cfloat.



FLT_EVAL_METHOD     

Possible values:
-1 undetermined
 0 evaluate just to the range and precision of the type
 1 evaluate float and double as double, and long double as long double.
 2 evaluate all as long double 
  

如果你的编译器定义了FLT_EVAL_METHOD为 2,则计算r1 and r2,和的s1 and s2下面分别是等价的:

double var3 = …;
double var4 = …;

double r1 = var3 * var4;
double r2 = (long double)var3 * (long double)var4;

long double s1 = var3 * var4;
long double s2 = (long double)var3 * (long double)var4;

如果您的编译器将 FLT_EVAL_METHOD 定义为 2,则在上面的所有四个计算中,乘法将以以下精度完成:long double type.

但是,如果编译器定义FLT_EVAL_METHOD作为 0 或 1,r1 and r2、 和 分别s1 and s2,并不总是相同。计算时的乘法r1 and s1的精度为double。计算时的乘法r2 and s2的精度为long double.

从狭隘的论点中获得广泛的结果

如果您计算的结果注定要存储在比操作数类型更宽的结果类型中,如下所示result1 and result2在您的问题中,您应该始终将参数转换为至少与目标一样宽的类型,如下所示:

result2=(long double)var3*(long double)var4;

没有这种转换(如果你写var3 * var4),如果编译器的定义FLT_EVAL_METHOD为 0 或 1,乘积将以以下精度计算double,这是一种耻辱,因为它注定要存储在long double.

如果编译器定义了FLT_EVAL_METHOD为 2,则转换为(long double)var3*(long double)var4不是必需的,但它们也不会造成伤害:无论有没有它们,该表达的含义完全相同。

题外话:如果目标格式与参数一样窄,那么中间结果的扩展精度何时更好?

矛盾的是,对于单个操作,仅舍入一次到目标精度是最好的。以扩展精度计算单个乘法的唯一效果是结果将四舍五入到扩展精度,然后舍入到double精确。这使得不太准确。换句话说,与FLT_EVAL_METHOD0或1,结果r2上面有时不如r1由于双舍入,并且如果编译器使用 IEEE 754 浮点,那就再好不过了。

对于包含多个操作的较大表达式,情况有所不同。对于这些,通常最好以扩展精度计算中间结果,或者通过显式转换,或者因为编译器使用FLT_EVAL_METHOD == 2. This question其接受的答案表明,当使用 80 位扩展精度中间计算进行二进制 64 IEEE 754 参数和结果计算时,插值公式u2 * (1.0 - u1) + u1 * u3总是产生介于u2 and u3 for u1介于 0 和 1 之间。此属性可能不适用于二进制 64 精度中间计算,因为此时舍入误差较大。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浮点算术运算的精度是多少? 的相关文章

随机推荐

  • 如何让 Visual Studio 将 DLL 文件复制到输出目录?

    我有一个依赖外部 DLL 文件的 Visual Studio C 项目 当我构建项目时 如何让 Visual Studio 自动将此 DLL 文件复制到输出目录 调试 发布 中 在项目中使用构建后操作 并添加命令来复制有问题的 DLL 构建
  • C# - IComparer - 如果日期时间为空,则应排序到底部而不是顶部

    我有一个日期列表 我想按升序排序 但是 默认比较器意味着我有 null null 18 01 2011 23 01 2011 有人可以帮助使用 IComparer 这意味着按升序排序的日期将如下所示 18 01 2011 23 01 201
  • 如何在 Next.js 中加载外部图像?

    JavaScript 和我正在加载随机图像https picsum photos但它不起作用 请注意 目前我不想在 next js 中使用新的图像优化 本地图像有效 但外部图像无效 下面是我的代码和我的 next config js
  • Java7 空安全方法调用

    我想了解有关Java7此功能的详细信息 例如这段代码 public String getPostcode Person person if person null Address address person getAddress if a
  • android中如何获取Image View的宽度和高度?

    在我的代码中我有一个Image View在我的 XML 布局中 我不断在代码中更改源图像 现在我想知道每次生成的图像的宽度和高度 我尝试使用getWidth getHeight getMeasuredWidth and getMeasure
  • 如何确定字符串中包含的值是否为 double

    在Java中 我试图找出字符串中包含的值是否为double boolean isDouble String str try Double parseDouble str return true catch NumberFormatExcep
  • Bottle-Friendly WSGI 身份验证库/中间件 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要的是一个轻量级身份验证 ACL 库或中间件 最好能够支持 openID 尽管这不是至关重要的 并且可以与 Bottle 框架很好地配合 即 可
  • 有没有一种简单的方法可以从 Maven POM 生成 Ant 构建脚本?

    我们有一个使用 Maven 作为其构建 依赖管理工具的项目 但是我们的代码需要在客户站点进行编译 并且客户要求我们提供为 Ant 编写的构建脚本 因此 我们希望继续使用 Maven 并在需要将代码交付给客户端时自动生成 Ant 脚本 我们可
  • Xcode 7 中的 NSToolbar 使用 Storyboards (NSWindowController -> NSSplitViewController)

    嗨 我已经看到这个问题被问过几次了 但还没有明确的答案 所以我为 xcode 7 和 swift2 创建了它 无论如何 这可能已经改变了一些事情 我使用 Xcode 7 和 Cocoa OSX Storyboard swift2 创建了一个
  • jquery:ajax加载的内容全部加载时的事件(包括图像)

    我正在通过ajax加载一些html 我需要一个事件来捕捉新图像加载时的情况 因为它在一个 div 中而不是整个页面中 所以我不能使用 window load 我已尝试以下方法 但它不起作用 banners col img last load
  • php dblib,错误:SQLSTATE[HY000] 未知主机名称(严重性 2)

    我使用的是 Mac 电脑 OSX 10 9 Freetds 和 unixODBC 已安装在我的计算机上 并作为扩展添加到 php 尝试连接到远程 MSSQL 服务器 以下是我的连接测试 错误日志文件显示 error client 127 0
  • CSS容器伪元素?

    在CSS中 有像 before 和 after 这样的伪元素 这会在元素之前或之后创建虚拟元素 容器伪元素 是否有 容器 伪元素 问题示例1 我需要在一个元素周围创建 15 个边框 我知道这个特定的示例可以通过使用 box shadow 来
  • javax.imageio.ImageIO 是否损坏?它导入一些旋转的图像

    下面你会看到一张漂亮的糕点的图片 名为 simit 来自土耳其 它取自 iPad 2 因此它是具有尺寸的 JPEG720 960 问题是 当我使用javax imageio ImageIO read方法 它奇怪地导入的图像是Buffered
  • 使用 PowerShell (Start-Process) 启动进程时是否可以定位窗口?

    我正在运行命令如下 Start Process dotnet ArgumentList run 窗户可以管理 using WindowStyle标记为最大化 最小化 隐藏和正常 然而 我通常做的是将框架推到左边 第二个框架推到右边 是否可以
  • Internet Explorer 8 忽略 CSS 中的字体粗细

    所以我无法理解为什么 IE 在这里忽略我的 CSS 我有这个代码 h2 Har du stadsn t eller kan du f det h2 IE 没什么奇怪的或什么的 这是最终的渲染结果 但这里是该 HTML 的 CSS 代码 ru
  • Xcode 中的重复符号错误

    当我在添加自己的框架后尝试构建项目时 在 Xcode 4 5 1 中遇到 重复符号 错误 我验证了框架文件是否有重复项 但没有 但是当我将框架添加到项目中时 它会抱怨这些错误 请建议 duplicate symbol NXArgc in A
  • 如何根据物品的重量将物品列表分成相等的分区?

    我有一个有点像这样的项目列表 orange 9 watermelon 3 grapefruit 6 peach 8 durian 2 apricot 6 我想将此列表分成 比如说两组 以便每组中项目的权重总和尽可能相等 即 List 1 o
  • 共享库与静态库的加载时间

    我有一个关于共享库与静态库加载时间的问题 假设我有一个可执行文件 foo exe 它使用 liba libb libc 此外 在给定时间 计算机上运行的可执行文件实例超过 10 个 现在如果以上 3 个库是共享库 第一个实例加载到 RAM
  • 使用 Jquery 按 id 选择 tr

    我正在尝试在表中选择一个 tr 来删除它 但选择器没有任何运气 表格看起来像这样 table width 301 border 0 cellspacing 5 cellpadding 0 gt tbody tr th width 56 Pr
  • 浮点算术运算的精度是多少?

    考虑下面两个非常简单的乘法 double result1 long double result2 float var1 3 1 float var2 6 789 double var3 87 45 double var4 234 987 r