首页 / 知识
关于变量:比较IEEE浮点数和双精度是否相等
2023-04-12 19:53:00

Comparing IEEE floats and doubles for equality比较IEEE浮点数和双精度数是否相等的最佳方法是什么? 我听说过几种方法,但是我想看看社区的想法。 我认为最好的方法是比较ULP。
类似的技术可以用于双打。诀窍是转换浮点数,以便对它们进行排序(就像整数一样),然后看看它们有何不同。 我不知道为什么这该死的东西搞砸了我的下划线。编辑:哦,也许这只是预览的人工产物。那没关系 我正在使用的当前版本是这个
通过结合相对和绝对错误容忍度,这似乎可以解决大多数问题。 ULP方法更好吗?如果是这样,为什么? 在数值软件中,您通常想测试两个浮点数是否完全相等。对于此类情况,LAPACK充满了示例。当然,最常见的情况是您要测试浮点数是否等于"零","一个","两个","半"。如果有人感兴趣,我可以选择一些算法,并进一步详细介绍。 另外,在BLAS中,您经常需要检查浮点数是正好是零还是1。例如,例程dgemv可以计算以下形式的运算
因此,如果beta等于1,则您有一个"加号分配",而对于beta等于0,则有一个"简单分配"。因此,如果对这些(常见)案例进行特殊处理,您当然可以削减计算成本。 当然,您可以以避免完全比较的方式设计BLAS例程(例如,使用某些标志)。但是,LAPACK充满了不可能的示例。 附言:
而是取决于您对他们的处理方式。与IEEE浮点数具有相同范围的定点类型将慢很多倍(并且大很多倍)。
3D图形,物理/工程,模拟,气候模拟。...
我实际上已经达到了这个极限...我试图在模拟中以ps为单位的时间和以时钟周期为单位的时间,在您轻松达到10 ^ 10周期的情况下。不管我做了什么,我很快都溢出了64位整数的微不足道的范围... 10 ^ 19并不像您想象的那样多,现在给定128位整数运算! 浮点数使我能够解决数学问题,因为低端的值溢出了很多零。因此,您基本上可以在数字上保留小数点后的整数,而不会损失精度(我想与64位int相比,在float的尾数中允许使用更有限的不同数量的值,但是迫切需要这个范围! )。 然后事物转换回整数以进行比较等。 令人烦恼的是,最后我放弃了整个尝试,只是依靠float和<和>来完成工作。并不是很完美,但是可以用于预期的用例。
好的,但是如果我想要一个无限小的位分辨率,那么它又回到了我原来的观点:==和!=在这种问题的上下文中没有任何意义。 一个int让我表达?10 ^ 9个值(无论范围如何),对于任何我关心其中两个相等的情况,这似乎足够了。如果这还不够,请使用64位操作系统,您将获得大约10 ^ 19个不同的值。 我可以在一个int中表示一个范围为0到10 ^ 200的值,例如,位分辨率受到的影响(分辨率将大于1,但是同样,没有应用程序也具有这种范围)作为那种分辨率)。 总而言之,我认为在所有情况下,要么代表一个连续的值,在这种情况下!=和==不相关,或者代表一个固定的值集,可以将其映射为一个int(或另一个固定值)。 -精度类型)。 @DrPizza:我不是性能专家,但我希望定点运算比浮点运算更快(在大多数情况下)。 @克雷格·H:好的。我完全可以打印它。如果a或b存钱,则应以定点表示。我正在努力思考一个真实的例子,在这种例子中,这种逻辑应该与浮点数相关联。适用于彩车的东西:
对于所有这些事情,您要么编号然后简单地将结果呈现给用户以供人工解释,要么做出比较性的陈述(即使这样的陈述是"该事物与另一事物之差在0.001之内")。像mine这样的比较语句仅在算法上下文中有用:" 0.001之内"部分取决于您要询问的物理问题。那我0.02。还是我应该说2/100分?
也许我应该更好地解释这个问题。在C ++中,以下代码:
打印短语"出了点问题"。您是说应该吗?
也许我们无法承受这种方法会造成的范围或性能损失。 如果您希望两个浮点数相等,那么我认为它们应该相等。如果您面临浮点取整问题,那么定点表示可能会更适合您的问题。
即使我们进行数值分析以最大程度地减少误差的累积,我们也无法消除它,而剩下的结果应该是相同的(如果我们使用实数进行计算)但有所不同(因为我们不能使用实数进行计算)。
ULP是两个浮点数之间"距离"的直接度量。这意味着它们不需要您想出相对和绝对误差值,也不必确保获得"大约正确"的值。使用ULP,您可以直接表达您想要的数字接近程度,并且相同的阈值对于小数值和大数值都适用。
如果您有浮点错误,那么您将遇到的问题甚至更多。虽然我认为这取决于个人观点。
即使它导致它通过内存从向量寄存器复制到整数寄存器,甚至使流水线停顿,它也是我遇到的最好的方法,因为即使面对现实,它也提供了最可靠的比较浮点错误。 即是值得付出的代价。 噢,亲爱的上帝,除非您在P6或更早的版本上运行,否则请勿将浮点位解释为整数。 |
最新内容
相关内容
python有map方法吗
python有map方法吗,培训,位置,数据,函数,列表,序列,参数,元素,方法,使用方法,python中的map:map()会根据提供的函数对指定序列做映射。第一个python变量怎么使用
python变量怎么使用,培训,信息,数字,变量,字母,空格,开头,关键字,意义,规则,python中的变量主要是用来存贮信息的。message="HelloPythonworpython声明变量
python声明变量,培训,代码,变量,赋值,字符串,类型,语句,函数,上面,声明,首先,在Python解释器中输入如下内容:>>>a=5上面代码没有生成任何输出,只python可以定义变量先不赋值吗
python可以定义变量先不赋值吗,培训,数字,变量,合法,代码,声明,类型,赋值,整数,字符串,Python中常见的数据类型有字符串,整形,列表,元组,字典等。python声明变量类型
python声明变量类型,培训,代码,基础,变量,赋值,类型,字符串,语句,函数,上面,对于没有编程基础的读者,可以先不编写真正的Python程序,而是先打开python变量不需要声明吗
python变量不需要声明吗,培训,数字,变量,代码,合法,声明,类型,整数,字符串,布尔,Python中常见的数据类型有字符串,整形,列表,元组,字典等。在Pythpython有哪些方法可以解压文件?
python有哪些方法可以解压文件?,工具,系统,工作,培训,文件,文件夹,方法,窗体,不同于,以下内容,在Python学习和日常使用中,很容易造成文件过大。python函数与方法的区别是什么
python函数与方法的区别是什么,培训,函数,方法,区别,对象,以上,方式,更多,内容,python中函数和方法的区别1、函数要手动传self,方法不用传selpython变量赋值是什么
python变量赋值是什么,培训,变量,名称,数字,标准,类型,赋值,声名,字符串,数据类型,1、什么是变量?变量:值会发生变化的的量,与常量相对.2、pythpython怎么声明变量
python怎么声明变量,培训,通用,一致,数字,变量,声明,字符串,引号,方式,类型,python声明变量:1、变量声明声明变量的时候,直接使用例如a=1这样的python字符串切片的方法是什么
python字符串切片的方法是什么,培训,字符串,索引,切片,开头,方括号,时候,方法,冒号,首尾,获取Python字符串中的某字符可以使用索引:lang=pythopython子类怎么调用父类方法
python子类怎么调用父类方法,培训,代码,初始化,方法,函数,示例,时调,定义,对象,以上,python中类的初始化方法是__init__(),因此父类子类的初始