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

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(使用前将#替换为@)

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

  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 测量窗口偏移

    有没有一种方法可以测量 jQuery 中窗口的偏移量 以便我可以比较 固定 元素和相对定位元素的位置 我需要能够知道窗口滚动了多远 以便我可以使用该图来计算固定元素的高度 相对于视口顶部 和相对对象的高度 相对于顶部 之间的差异文件的内容
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • PrimeFaces 对话框参考父级

    我有一个 xhtml 页面 显示带有条目的数据表 我还有一个用于插入新条目的按钮 该按钮显示一个包含表单的对话框 插入表格用作
  • Pandas 与 Numpy 数据帧

    看这几行代码 df2 df copy df2 1 df 1 df 1 values 1 df2 ix 0 0 我们的教练说我们需要使用 values属性来访问底层的 numpy 数组 否则我们的代码将无法工作 我知道 pandas Data
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • Amazon RDS for SQL Server 是否支持 SSIS?

    从谷歌搜索中读到一些相互矛盾的答案 不确定答案是是 否还是可能 我觉得读的时候已经很清楚了this http docs aws amazon com AmazonRDS latest UserGuide CHAP SQLServer htm
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对
  • 如何在 JFreeChart 中设置多个系列的线条粗细?

    我创建了很多图表 在他们每个人中我都需要打电话 renderer setSeriesStroke i new BasicStroke 2 0f 对于每个系列 renderer is chart getXYPlot getRenderer 我
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈
  • 禁用允许文本选择的

    残疾人可以吗
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • 如何让 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