问题标签 [floating-accuracy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1984 浏览

floating-point - 验证双值范围和步骤

我正在尝试构建一个算法来验证双精度值是否是由最小值、最大值和步长值定义的范围的成员。问题是检查该值是否符合步进规则。对于整数,这很容易做到:

但是,这不适用于双精度值。我知道这至少部分是出于精确的原因,我尝试通过将所有值乘以一个非常高的数字并将它们转换为长整数来破解解决方案。但是,这不适用于所有值,并且在检查余数时也不允许从 0 出现小偏差。有没有人遇到过这个问题并想出了一个好的解决方案?下面是一个以非工作验证方法为特色的示例和测试。

这样做的一种方法是从最小值开始并逐步增加它,直到它等于或大于输入值,但除了一个丑陋的解决方案之外,这可能是我的应用程序中的潜在瓶颈,所以我真的很想避免。

我很感激任何指示...

问候/亨里克

}

0 投票
1 回答
145 浏览

sql-server - 为什么结果会出现差异?

如果我应用比内公式和递归公式来查找斐波那契数列,则结果存在差异。为什么?

基本上我是一名学生,实现斐波那契数列是我们的任务。因此,在进行实验时,我遇到了这种情况。

提前致谢

0 投票
16 回答
1630 浏览

c++ - (1 + sqrt(2))^2 = 3 + 2*sqrt(2) 在浮点运算中是否满足?

在数学中,同一性(1 + sqrt(2))^2 = 3 + 2*sqrt(2)是正确的。但在浮点(IEEE 754,使用单精度,即 32 位)计算中,情况并非如此,因为sqrt(2)它没有精确的二进制表示。

那么使用 的近似值是否sqrt(2)会为左侧和右侧提供不同的结果?如果是,为什么?对近似值进行平方会显着降低精度吗?

那么,哪个等价表达式给出了最准确的结果?

0 投票
7 回答
1329 浏览

haskell - 为什么 ghci 说 1.1 + 1.1 + 1.1 > 3.3 是真的?

我最近一直在阅读 Haskell 教程,并在交互式ghcishell 中尝试一些简单的 Haskell 表达式时注意到了这种行为:

有人知道这是为什么吗?

0 投票
3 回答
733 浏览

optimization - 是否有编译器优化浮点运算以提高准确性(而不是速度)?

我们知道编译器在优化我们的代码并使其运行得更快方面越来越好,但我的问题是有编译器可以优化浮点运算以确保更高的准确性。

例如,一个基本规则是在加法之前执行乘法,这是因为使用浮点数的乘法和除法不会像加法和减法那样引入误差,但会增加加法和减法引入的误差幅度,所以它应该很多情况下要先做。

所以像这样的浮点运算

应改为

有没有编译器会像我上面展示的那样以牺牲速度为代价来优化浮点精度?还是编译器速度的主要关注点是不考虑浮点运算的准确性?

谢谢

更新:所选答案显示了一个非常好的示例,其中这种优化不起作用,因此编译器不可能事先知道评估 y 的更准确方法是什么。感谢您的反例。

0 投票
4 回答
2427 浏览

perl - 当我在 Perl 中从自身减去相同的浮点数时,为什么我不会得到零?

可能的重复:
为什么 C# 中的浮点运算不精确?
为什么 ghci 说 1.1 + 1.1 + 1.1 > 3.3 是真的?

令人惊讶的是,输出最终是

它不应该是零吗????谁能解释一下这个请......

0 投票
7 回答
114979 浏览

floating-point - 浮点数不准确示例

您如何向仍然认为计算机无限聪明和准确的新程序员和外行解释浮点不准确性?
你有没有一个最喜欢的例子或轶事似乎比精确但枯燥的解释更能传达这个想法?
这是如何在计算机科学课程中教授的?

0 投票
5 回答
3577 浏览

c++ - 计算浮点数中的数字

我正在关注一些 C++ 中 OpenGL 的初学者教程,但是当我开始作为 ac# 程序员时,它让我认为很多事情是理所当然的。所以当我调试将我的 FPS 读数打印到输出时出现了我的问题。我认为该方法类似于我头顶上的 DebugPrintString,它需要一个 char* 并且基本上我正在打印“FPS:x”。我使用 scanf_s 将 fps 值放入字符数组中,但这是我的问题所在。字符数组必须有多大?

让我再详细说明一下:我的 FPS 读数存储为浮点数,因为帧/秒通常最终不是一个好数字。所以我的号码可能是 60,也可能是 59.12345。60 只需要 2 个字节,而 59.12345 需要 8 个(周期为 1)。所以我想“哦,好吧,我需要计算它的位数,没问题!” 男孩让我感到震惊。

我做了一种计算数字的方法,计算小数点左侧很容易,首先将其转换为 int 以删除小数点并除以 10(实际上我认为我在那里进行了一些位移)和计算我可以这样做的次数,直到我达到 0。现在要计算右侧的数字,我将乘以 10,减去数字,然后这样做直到它达到零。我认为该方法通常会返回 32。所以我 WTF'd 并在调试中查看了它,结果当你将浮点数相乘时有效地将数字列向上移动,因为众所周知的精度问题它只是附加了另一个数字!

我做了一些主要的谷歌搜索,但在 char str[128] 和 scanf 之上找不到任何内容,如果在 then 中执行 strlen(str) 减 1(空终止符)。但我希望有一个更优雅的解决方案。最后我只是将它转换为一个 int 并允许 9999 fps,还添加了一个检查以查看 fps > 9999 但我认为这不会发生。比 SEG FAULT 更安全 :(

TLDR:有没有办法获得浮点数的位数?scanf 是怎么做到的?!

抱歉发了很长的帖子,只是想分享我的挫败感>:D

编辑:拼写错误

0 投票
5 回答
4861 浏览

floating-point - 如何以完美的精度将字符串转换为浮点数?

我正在尝试用 D 编程语言编写一个函数来替换对 C 的 strtold 的调用。(基本原理:要从 D 中使用 strtold,您必须将 D 字符串转换为 C 字符串,这是低效的。此外,strtold 不能在编译时执行。)我想出了一个最有效的实现,但我似乎在最低有效位上失去了一些精度。

该算法有趣部分的代码如下,我可以看到精度损失的来源,但我不知道如何摆脱它。(我省略了很多与核心算法无关的代码部分,以节省人们的阅读时间。)什么字符串到浮点算法将保证结果将尽可能接近 IEEE 编号行到由字符串表示的值。

此外,我正在使用旧版本的单元测试,它执行以下操作:

是否有可能我的函数产生的答案实际上比编译器在解析浮点文字时产生的表示更准确,但是编译器(用 C++ 编写)总是与 strtold 完全一致,因为它在内部使用 strtold 进行解析浮点文字?

0 投票
2 回答
1817 浏览

graphics - 基于着色器的 mandelbrot explorer 的大浮点数

我已经设法使用 Open Gl 和 NVidia 提供的 CGFX SDK 创建了一个简单的 mandelbrot 浏览器。它工作得很好,但目前是基于浮点的,因此没有太多的“深度”——随着从最小复数到最大复数的距离变小,精度会丢失,并且生成的图像是“像素化的”。

不幸的是,CGFX 似乎不支持双精度,即使这样,双精度也仅限于我的意图。因为 CGFX,因为它的预期设计,没有 bignum 类,我认为最好创建我自己的类。

我设法在 C++ 中创建了一个原型——它只使用无符号整数——但是当我试图将它移动到 CGFX 时,FX Composer 2.5 似乎无法编译它。因为我只使用无符号整数、乘法和加法,所以代码包含很多位移操作,根据 FX Composer 2.5,这些操作在我的配置文件中不可用。

我知道这个问题包含很多查询,但不幸的是,我对数值分析、着色器编程或 open gl 并不是很熟悉,此时我感到不知所措——而且很确定我正在尝试修复泄漏用大锤。

因此,如果有人对这些问题中的任何一个有答案,我将不胜感激:

  1. CGFX 或任何其他着色器语言是否支持无符号整数和浮点数的位移运算符(需要将浮点数转换为大浮点数)?

  2. CGFX 或任何其他着色器语言是否支持双精度或更高的浮点?

  3. 有没有更精致的数学方法来处理我的问题,而不是创建一个大的浮点类?

如果有人需要更多说明或代码片段,请随时提出。