- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例:
0.008 == 0.001 * 8
0.009 < 0.001 * 9
0.035 == 0.001 * 35
0.036 < 0.001 * 36
0.0x <= 0.01 * x
0.000x <= 0.0001 * x
0.0000000000000x <= 0.0000000000001 * x ; for arbitrary zeros
最佳答案
.000005 <= .000001 * 5
评估为false。
Matlab specifies double
to be IEEE-754 binary64,但是C标准没有,尽管许多实现使用它。通常,以2和10为基数的浮点数。在底数为10的情况下,构成关系成立,实际上,两个表达式在格式的范围内相等。 (当x
太大以至于将其转换为double
时,无穷大,相等性就不成立。)在其他基础上,可以找到类似于此答案中所示的反例。1对于此答案的其余部分,IEEE-在数字格式和操作行为方面均假定为754 binary64。
我们应该了解如何评估诸如.000…000x <= .000…0001 * x
的表达式:
首先,源文本中的每个数字都转换为double
。在此转换过程中,数字将四舍五入为可表示的值。此舍入通常通过舍入到最接近的可表示值,并与具有偶数低位(位)的值相关联。
然后执行乘法,结果就好像实数结果舍入为可表示的值。同样,四舍五入是最常见的。
然后评估比较<=
。这没有错误;当且仅当右操作数大于或等于左操作数时,它才会生成true。
我认为x
是非负数。否定的x
,请参阅第一个附录。
首先,考虑使用最近舍入法。
将.000001
转换为double
会产生0.0000009999999999999999999948148111825886258685613938723690807819366455078125。在使用printf(".99f\n", .000001);
的良好C实现中可以看到这一点。 (由于C标准既没有完全指定编译时十进制数字到浮点数的转换,也没有完全通过printf
指定浮点数到十进制的转换,因此在不使用正确的四舍五入的实现中可能会有一些变化。 )如我们所见,它小于.000001。可以通过打印.1
,.01
,.001
等轻松找到它,直到找到恰好四舍五入的数字。然后,我们测试各种x
,直到找到恰好针对它的.00000x
取整。将.000005
转换为double
产生0.0000050000000000000004090152695701565477293115691281855106353759765625。接下来,对于小整数x
,x
在double
中可以精确表示,因此将该操作数转换为double
不会产生舍入错误。我们几乎满意.00000x <= .000001 * x
,因为左侧包含四舍五入,而右侧包含四舍五入。但是,乘法也可能会舍入,从而使我们无法做好准备。再次,测试几个x
可能会发现一个没有发生这种情况的示例-如果乘法不精确,那么它是向上舍入还是向下舍入基本上取决于x
中的某个位,因此很少有试验足以找到一个可行的例子。
回到原始比例,用.001代替.000001,我们可以说.00x <= .001 * x
对于小于253的所有x
成立。这是因为所有此类整数x
在double
中都可以精确表示,并且.001
到double
取整,产生0.001000000000000000020816681711721685132943093776702880859375。因此,即使左侧.00x
向下舍入,右侧也包含向上舍入,只能通过乘法中的向下舍入来补偿,因为x
到<的转换中没有舍入cc>。由于每次舍入只能移至下一个可表示的值,而不能跳过任何下一个值,因此乘法中的舍入不能使右侧偏左。因此,double
对于所有小于253的.00x <= .001 * x
成立。
高于此值,将x
转换为x
可能会导致舍入错误,并且搜索很容易找到反例(在253以上的第四个奇数中):double
,将9007199254741.001 <= .001 * 9007199254741001
转换为9007199254741.001
会产生
double
转换为
9007199254741.001953125
会产生
9007199254741001
,而右侧的值将计算为
double
。
如果考虑其他舍入模式:
朝-∞(向下舍入)或向0舍入时,右侧将向下遭受多达三个舍入误差,因此我们可以预期在很多情况下该关系失败。
向+∞取整(向上取整)时,右侧必须至少经历一个向上取整误差,因为
9007199254741000
永远无法在基数为2的浮点数中精确表示,并且向上取整规则永远不允许右侧取整。消除了此错误,并且左侧只能有一个舍入错误,它永远不会超过右侧的错误,因此该关系必须始终成立。
附加物
9007199254741
可以为负吗?该问题的语法建议否,因为对于
.000…0001
= -3,
x
将变为
x
,这不会形成正确的数字。如果我们将其设置为
.00x
,则当
.00-3
的大小太大以至于将其转换为
-.003
会产生-∞时,
.00x <= .001 * x
会失败,但不会太大,从而将
x
转换为
double
会产生- ∞。在这种情况下,我们将有限值与-∞进行比较,并且比较结果为false。在
.00x
格式的范围内(值保持有限),比较会遇到上述问题,但需要对舍入规则进行一些修改。
请注意,如果
double
足够小,则将其转换为
double
可能会产生零(在除向+∞以外的任何标准舍入模式下),并且
.000…0001
可能足够大以使其产生∞,在这种情况下将它们相乘会产生一个NaN(或陷阱),并且该关系不成立,因为NaN与数字没有关系。
脚注
1在以10为倍数的底数中,可能会有一些不寻常的相互作用,而这个答案并未探讨。
关于floating-point - “0.00x <= 0.001 * x”是否始终保持两倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57267351/
我知道问题的标题听起来很奇怪,但我不知道该怎么调用它。 首先,我有一个网格布局,我希望我的 .search-wrapper 宽度为 50% 并向右浮动。在我的演示中 jsfiddle整个 .searc
我们正在使用 QA-C 来实现 MISRA C++ 一致性,但是该工具会为这样的代码喷出错误: float a = foo(); float b = bar(); float c = a - b; 据
考虑 float a[] = { 0.1, 0.2, 0.3}; 我很困惑a稍后传递给函数 foo(float* A) .不应该是 float* 类型的变量指向单个浮点数,对吗?就像这里提到的tu
这可能是我一段时间以来收到的最好的错误消息,我很好奇出了什么问题。 原代码 float currElbowAngle = LeftArm ? Elbow.transform.localRotation
刚开始学习 F#,我正在尝试为 e 生成和评估泰勒级数的前 10 项。我最初编写了这段代码来计算它: let fact n = function | 0 -> 1 | _ -> [1
我已经使用 Erlang 读取二进制文件中的 4 个字节(小端)。 在尝试将二进制转换为浮点时,我一直遇到以下错误: ** exception error: bad argument in
假设我有: float a = 3 // (gdb) p/f a = 3 float b = 299792458 // (gdb) p/f b = 29979244
我每次都想在浏览器顶部修复这个框。但是右边有一些问题我不知道如何解决所以我寻求帮助。 #StickyBar #RightSideOfStickyBar { float : right ; }
我正在研究 C# 编译器并试图理解数学运算规则。 我发现在两种不同的原始类型之间使用 == 运算符时会出现难以理解的行为。 int a = 1; float b = 1.0f; Cons
假设我有: float a = 3 // (gdb) p/f a = 3 float b = 299792458 // (gdb) p/f b = 29979244
Denormals众所周知,与正常情况相比,表现严重不佳,大约是 100 倍。这经常导致 unexpected软件 problems . 我很好奇,从 CPU 架构的角度来看,为什么非规范化必须是 那
我有一个由两个 float 组成的区间,并且需要生成 20 个随机数,看起来介于两个 float 定义的区间之间。 比方说: float a = 12.49953f float b = 39.1123
我正在构建如下矩阵: QMatrix4x3 floatPos4x3 = QMatrix4x3( floatPos0.at(0), floatPos1.at(0), floatPos2.at(0),
给定归一化的浮点数f,在f之前/之后的下一个归一化浮点数是多少。 通过微动,提取尾数和指数,我得到了: next_normalized(double&){ if mantissa is n
关于 CSS“float”属性的某些东西一直让我感到困惑。为什么将“float”属性应用到您希望 float 的元素之前的元素? 为了帮助可视化我的问题,我创建了以下 jsFiddle http://
关于 CSS“float”属性的某些东西一直让我感到困惑。为什么将“float”属性应用到您希望 float 的元素之前的元素? 为了帮助可视化我的问题,我创建了以下 jsFiddle http://
我有一个新闻源/聊天框。每个条目包含两个跨度:#user 和#message。我希望#user 向左浮动,而#message 向左浮动。如果#message 导致行超过容器宽度,#message 应该
我想创建一个“记分卡”网格来输出一些数据。如果每个 div.item 中的数据都具有相同的高度,那么在每个 div.item 上留下一个简单的 float 会提供一个漂亮的均匀布局,它可以根据浏览器大
我正在学习使用 CSS float 属性。我想了解此属性的特定效果。 考虑以下简单的 HTML 元素: div1 div2 This is a paragraph 以及以下 CSS 规则: div {
我正在尝试从可以是 int 或 float 的文件中提取数据。我发现这个正则表达式将从文件 (\d+(\.\d+)?) 中提取这两种类型,但我遇到的问题是它将 float 拆分为两个。 >>> imp
我是一名优秀的程序员,十分优秀!