问题标签 [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.
c - 在 C 中实现具有非常小的数字的方程 - 普朗克定律生成黑体
我有一个问题,经过多次挠头,我认为这与长双打中非常小的数字有关。
我正在尝试实现普朗克定律方程,以在给定波长范围和给定温度之间以 1nm 的间隔生成归一化黑体曲线。最终这将是一个接受输入的函数,现在它是 main(),变量固定并由 printf() 输出。
我在matlab和python中看到了示例,它们在类似的循环中实现了与我相同的方程,完全没有问题。
这是等式:
我已经独立测试了代码的关键部分。在尝试通过在 excel 中将方程分解成块来测试方程后,我注意到它确实会产生非常小的数字,我想知道我对大数字的实现是否会导致问题?有没有人对使用 C 来实现方程有任何见解?这对我来说是一个新领域,我发现数学比普通代码更难实现和调试。
/************************更新 2017 年 3 月 24 日星期五 23:42************************ *****/
到目前为止,感谢您的建议,许多有用的指针特别是了解数字在 C ( IEEE 754 ) 中的存储方式,但我认为这不是这里的问题,因为它仅适用于有效数字。我实施了大部分建议,但在这个问题上仍然没有进展。我怀疑评论中的 Alexander 可能是对的,我可能需要更改操作的单位和顺序才能使方程式像 matlab 或 python 示例一样工作,但我的数学知识不足以做到这一点。我把方程分解成几块,仔细看看它在做什么。
xcode中运行时的方程变量值:
c - 如何识别 long double 数据类型的精度
我的编译器告诉我 的大小sizeof(long double)
是 16 字节,这意味着它可以表示一个数字 up 2^128
。现在,我想知道精度可以处理多少位数。例如,如果x= 0.1234567812345678
,可以long double
识别这里的确切精度x
吗?
谢谢
c++ - 长双打在 Code::Blocks 中显示不正确
为什么长双精度数不能正确显示?我正在使用 MinGw32 4.9.2。例如,当 a = 56 且 b = 3 时,a 显示为 -2.6815615859885194e+154,b 显示为 -3,结果运算为 -5.075883675e-116
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 位系统上使用。
上面的引用可能是我观察到这一点的原因吗?如果不是,还有什么可能是原因?
mongodb - MongoDB 将 double 转换为 long
我正在尝试将数字 1477958757748.9697 转换为 mongo-shell 中的 long 。NumberLong 函数抛出错误:
NumberLong 有替代品吗?例如 NumberInt 确实适用于整数:
你怎么能在Mongo中做到这一点?
c++ - Eigen::MatrixXd typedefs 的替换
用具有元素的向量和矩阵替换所有Eigen::MatrixXd
s 和s的最简单方法是什么?Eigen::VectorXd
long double
我的代码中的每个基本浮点变量都是long double
. 此外,每次我使用矩阵或向量时,我都会使用以下 typedef。
将这些 typedef 切换为最好的方法是什么?如果我让它们保持原样会发生什么?
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 (typedef
s) 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.
ios - 如何将 NSString 转换为 long double?
我正在处理一个long double
可以具有巨大价值的价值。
有一次,我将此数字表示为NSString
,我需要将其转换为long double
. 我看到我拥有的唯一 API 是
我没有看到longDoubleValue
.
尝试使用doubleValue
...转换此数字
给我inf
,有问题的数字是合法long double
值,因为这些数字可以上升到1.18973149535723176502E+4932
.
我怎么做?
c - 反转长双精度的指数给了我一个疯狂的结果
我正在尝试反转长双精度数的指数。
假设 x = 3.5e1356。我希望 x 为 3.5e-1356。
我有这个代码:
在这段代码之后,newNumber
是1.14732677619641872902e-1357
这与原始数字无关。
我错过了什么?