问题标签 [long-double]

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 投票
1 回答
374 浏览

c++ - 长双溢出但值小于最大可表示值

我正在尝试使用 C++ 计算一个系列。该系列是:(
系列 对于那些想知道的人)

我的代码如下:

输出将是,例如gamma = 1.7伽玛达到无穷大等于: 1.7k892

long double由 STL 提供的 a 可以表示的最大值numeric_limits是:1.18973e+4932

但是(1+1.7^892)= 2.19.... × 10^308,它远低于10^4932,因此不应将其视为无穷大。

如果我的代码没有错(但很可能是错的),谁能告诉我为什么所讨论的代码在不应该时会计算为无穷大?

0 投票
2 回答
1236 浏览

c - 在 C 中实现具有非常小的数字的方程 - 普朗克定律生成黑体

我有一个问题,经过多次挠头,我认为这与长双打中非常小的数字有关。

我正在尝试实现普朗克定律方程,以在给定波长范围和给定温度之间以 1nm 的间隔生成归一化黑体曲线。最终这将是一个接受输入的函数,现在它是 main(),变量固定并由 printf() 输出。

我在matlabpython中看到了示例,它们在类似的循环中实现了与我相同的方程,完全没有问题。

这是等式

普朗克斯定律

我的代码生成了不正确的黑体曲线: 黑体码输出错误

我已经独立测试了代码的关键部分。在尝试通过在 excel 中将方程分解成块来测试方程后,我注意到它确实会产生非常小的数字,我想知道我对大数字的实现是否会导致问题?有没有人对使用 C 来实现方程有任何见解?这对我来说是一个新领域,我发现数学比普通代码更难实现和调试。

/************************更新 2017 年 3 月 24 日星期五 23:42************************ *****/

到目前为止,感谢您的建议,许多有用的指针特别是了解数字在 C ( IEEE 754 ) 中的存储方式,但我认为这不是这里的问题,因为它仅适用于有效数字。我实施了大部分建议,但在这个问题上仍然没有进展。我怀疑评论中的 Alexander 可能是对的,我可能需要更改操作的单位和顺序才能使方程式像 matlab 或 python 示例一样工作,但我的数学知识不足以做到这一点。我把方程分解成几块,仔细看看它在做什么。

xcode中运行时的方程变量值:

xcode中运行时的变量值

0 投票
2 回答
722 浏览

c - 如何识别 long double 数据类型的精度

我的编译器告诉我 的大小sizeof(long double)是 16 字节,这意味着它可以表示一个数字 up 2^128。现在,我想知道精度可以处理多少位数。例如,如果x= 0.1234567812345678,可以long double识别这里的确切精度x吗?

谢谢

0 投票
0 回答
58 浏览

c++ - 长双打在 Code::Blocks 中显示不正确

为什么长双精度数不能正确显示?我正在使用 MinGw32 4.9.2。例如,当 a = 56 且 b = 3 时,a 显示为 -2.6815615859885194e+154,b 显示为 -3,结果运算为 -5.075883675e-116

0 投票
1 回答
747 浏览

c++ - Valgrind 导致长双打的数字问题

我的代码中有以下函数检查数字是否具有允许的值(在日志空间中):

在使用此函数的上下文中,我专门使用长双精度数。当我在没有 valgrind 的情况下运行我的程序时,一切正常,但是当我使用 valgrind 运行它时,该函数实际上引发了异常。我怀疑 valgrind 做了一些改变长双打的格式或类似的事情。我找到了这个:

Valgrind 在实现 x86/AMD64 浮点时相对于 IEEE754 有以下限制。

精度:不支持 80 位算术。在内部,Valgrind 以 64 位表示所有此类“long double”数字,因此结果可能存在一些差异。这是否至关重要还有待观察。请注意,x86/amd64 fldt/fstpt 指令(读/写 80 位数字)是正确模拟的,使用与 64 位之间的转换,因此如果有人想看,80 位数字的内存图像看起来是正确的。

从许多 FP 回归测试中观察到的印象是准确性差异并不显着。一般来说,如果一个程序依赖于 80 位精度,那么将其移植到仅支持 64 位 FP 精度的非 x86/amd64 平台可能会有困难。即使在 x86/amd64 上,程序也可能得到不同的结果,具体取决于它是编译为使用 SSE2 指令(仅限 64 位)还是 x87 指令(80 位)。最终效果是使 FP 程序的行为就好像它们在具有 64 位 IEEE 浮点数的机器上运行一样,例如 PowerPC。在 amd64 上,FP 算法默认在 SSE2 上完成,因此从 FP 的角度来看,与 x86 相比,amd64 看起来更像 PowerPC,并且与 x86 相比,明显的精度差异要少得多。

舍入:Valgrind 确实遵守 4 种 IEEE 规定的舍入模式(到最接近、到 +infinity、到 -infinity、到零),用于以下转换:浮点到整数,整数到浮点,可能会丢失精度,以及浮点到浮点舍入。对于所有其他 FP 操作,仅支持 IEEE 默认模式(四舍五入)。

FP 代码中的数值异常:IEEE754 定义了五种可能发生的数值异常:无效操作(负数的 sqrt 等)、除以零、上溢、下溢、不精确(精度损失)。

对于每个异常,IEEE754 定义了两个操作过程:(1) 可以调用用户定义的异常处理程序,或者 (2) 定义默认操作,“修复”并允许计算在没有抛出异常。

目前 Valgrind 只支持默认的修复动作。再次感谢有关异常支持重要性的反馈。

当 Valgrind 检测到程序试图超过任何这些限制(设置异常处理程序、舍入模式或精度控制)时,它可以打印一条消息,追溯发生的位置,并继续执行。此行为曾经是默认行为,但消息很烦人,因此默认情况下显示它们现在已禁用。使用 --show-emwarns=yes 来查看它们。

上述限制精确地定义了 IEEE754 的“默认”行为:所有异常的默认修复、四舍五入到最近的操作和 64 位精度。

http://www.valgrind.org/docs/manual/manual-core.html#manual-core.limits

但我不确定这是否适用。Valgrind 并没有像引用中所说的那样打印出提供追溯的消息。它打印了这个:

顺便提一句。如果这与导致此行为的原因有关,我将g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609在 64 位系统上使用。

上面的引用可能是我观察到这一点的原因吗?如果不是,还有什么可能是原因?

0 投票
0 回答
1360 浏览

mongodb - MongoDB 将 double 转换为 long

我正在尝试将数字 1477958757748.9697 转换为 mongo-shell 中的 long 。NumberLong 函数抛出错误:

NumberLong 有替代品吗?例如 NumberInt 确实适用于整数:

你怎么能在Mongo中做到这一点?

0 投票
1 回答
1012 浏览

c++ - Eigen::MatrixXd typedefs 的替换

用具有元素的向量和矩阵替换所有Eigen::MatrixXds 和s的最简单方法是什么?Eigen::VectorXdlong double

我的代码中的每个基本浮点变量都是long double. 此外,每次我使用矩阵或向量时,我都会使用以下 typedef。

将这些 typedef 切换为最好的方法是什么?如果我让它们保持原样会发生什么?

0 投票
1 回答
1467 浏览

swift - Long Double in Swift

In C, there is a type called long double, which on my machine is 16-bytes (128-bit). Is there any way to store a long double in Swift? I've tried type aliases (typedefs) of long double from an Objective-C header, but it doesn't show up in Swift. And functions returning long double (powl, sqrtl) don't show up neither.

I know there's a Float80 but that's only 80 bits, not 128 bits.

0 投票
4 回答
396 浏览

ios - 如何将 NSString 转换为 long double?

我正在处理一个long double可以具有巨大价值的价值。

有一次,我将此数字表示为NSString,我需要将其转换为long double. 我看到我拥有的唯一 API 是

我没有看到longDoubleValue.

尝试使用doubleValue...转换此数字

给我inf,有问题的数字是合法long double值,因为这些数字可以上升到1.18973149535723176502E+4932.

我怎么做?

0 投票
3 回答
99 浏览

c - 反转长双精度的指数给了我一个疯狂的结果

我正在尝试反转长双精度数的指数。

假设 x = 3.5e1356。我希望 x 为 3.5e-1356。

我有这个代码:

在这段代码之后,newNumber1.14732677619641872902e-1357

这与原始数字无关。

我错过了什么?