问题标签 [numerical]
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.
generics - Scala:在泛型类中进行数值运算的最佳方法是什么?
在 Scala 中,我希望能够编写使用 >、/、* 等运算符的通用类,但我不知道如何约束 T 以使其起作用。
我研究了用 Ordered[T] 约束 T,但这似乎不起作用,因为只有 RichXXX(例如 RichInt)扩展它,而不是 Int 等。我还看到了 Numeric[T],这是否仅在 Scala 2.8 中可用?
这是一个具体的例子:
这个类不会编译,因为有很多不支持 > 等的 T。
想法?
现在我已经使用了 MixIn 特征来解决这个问题:
如果我们改变原始类,可以在实例化时混合。
PS Mitch,受您重写 getMax 的启发,这里是另一个:
algorithm - 组合问题和数值问题有什么区别
请您至少举两个例子。谢谢。
c - 使用 NAG 数学库重新分发应用程序 - 客户端必须有许可证?
有没有人处理过重新分发使用数值算法组 (NAG) 库的应用程序?
似乎当我构建一个可执行文件时,除非我为许可证文件设置了环境变量,否则它不会运行——即,如果我给某人提供了他们也需要许可证和相关守护程序的代码。
没有办法解决吗?我希望我只需要与它链接的许可证。
.net - 用于 F# 的简单包装器,用于执行矩阵运算
这是一篇比较长的帖子。F# 现在有一个矩阵和向量类型(在 PowerPack 中而不是在核心中)。这很棒!甚至 Python 的数值计算能力也是来自于第三部分。
但是那里提供的功能仅限于矩阵和向量算术,因此要进行反转,分解等,我们仍然需要使用另一个库。我现在正在使用最新的dnAnalytics,它正在合并到 Math.Net 项目中。但是 Math.Net 项目已经一年多没有向公众更新了,我不知道他们是否有继续的计划。
我做了以下包装器,这个包装器使用类似 Matlab 的函数来做简单的线性代数。由于我是 F# 和 FP 的新手,请您提供一些建议来改进包装器和代码?谢谢!
和测试代码
我也和matlab比较过
时序(双核 2.0GH,2GB 内存,Matlab 2009a)
c - 使用 IEEE 浮点进行优化 - 保证数学恒等式?
我在 IEEE 浮点规则方面遇到了一些问题,这些规则阻止了看起来很明显的编译器优化。例如,
不能优化为只返回 1,因为 NaN == NaN 为假。好吧,好吧,我猜。
但是,我想编写这样的代码,优化器实际上可以为我解决问题。是否存在适用于所有浮点数的数学恒等式?例如,我愿意写 !(x - x) 如果这意味着编译器可以假设它一直保持不变(尽管情况并非如此)。
我在网络上看到了一些对此类身份的引用,例如这里,但我没有找到任何有组织的信息,包括对 IEEE 754 标准的简单扫描。
如果我能让优化器假设 isnormal(x) 而不生成额外的代码(在 gcc 或 clang 中),那也很好。
显然,我实际上并不打算在我的源代码中编写 (x == x),但我有一个专为内联而设计的函数。该函数可以声明为 foo(float x, float y),但通常 x 为 0,或 y 为 0,或 x 和 y 均为 z 等。浮点数表示屏幕上的几何坐标。在这些情况下,如果我在不使用函数的情况下手动编码,我永远不会区分 0 和 (x - x),我只会手动优化愚蠢的东西。所以,我真的不关心编译器在内联我的函数后所做的 IEEE 规则,我只想让编译器忽略它们。舍入差异也不是很重要,因为我们基本上是在屏幕上绘图。
我不认为 -ffast-math 对我来说是一个选项,因为该函数出现在头文件中,并且使用该函数的 .c 文件与 -ffast-math 一起编译是不合适的。
java - 数值 Java 库
我的大部分代码都是用 Java 编写的。对于标准化算法:矩阵运算、FFT ......我宁愿不使用我自己的纯 Java 实现,并且非常乐意使用不安全的 FFI/JNI 调用。
我应该研究哪些库?
谢谢!
java - 如何编写数字Java代码?
在纯 Java中实现数值算法有哪些好的资源可供阅读?
我对 JVM 和 GC 的交互一无所知,并且很想了解更多。
javascript - Javascript将字符串转换为数字?
如何将上述转换为0.25?
.net - 处理 .NET 中的浮点错误
我正在使用 C#/.NET 进行科学计算和可视化项目,我们使用double
s 来表示所有物理量。由于浮点数总是包含一些舍入,我们有简单的方法来进行相等比较,例如:
很标准。
EPSILON
然而,当我们遇到“相等”量的误差大于我们预期的情况时,我们经常发现自己不得不调整量级。例如,如果将 5 个大double
s 相乘,然后再除以 5 次,就会损失很多准确度。它已经到了我们不能让 EPSILON 变得更大的地步,否则它会给我们带来误报,但我们仍然会得到误报。
一般来说,我们的方法是寻找更多数值稳定的算法来使用,但该程序的计算量很大,我们能做的只有这么多。
有没有人有任何好的策略来处理这个问题?我对这种Decimal
类型进行了一些研究,但我担心性能,而且我对它的了解还不够,不知道它是否会解决问题或只会掩盖问题。如果它可以解决这些问题,我愿意接受适度的性能损失(比如 2 倍)Decimal
,但性能绝对是一个问题,并且由于代码主要受浮点运算的限制,我不认为这是一个不合理的担忧。我见过有人引用 100 倍的差异,这绝对是不可接受的。
此外,切换到Decimal
还有其他复杂性,例如库中普遍缺乏支持Math
,因此我们必须编写自己的平方根函数,例如。
有什么建议吗?
编辑:顺便说一句,我使用常量 epsilon(而不是相对比较)这一事实不是我的问题的重点。我只是把它放在那里作为一个例子,它实际上并不是我的代码片段。更改为相对比较不会对问题产生影响,因为当数字变得非常大然后又变小时,问题就会出现精度下降。例如,我可能有一个值 1000,然后我对其进行一系列计算,结果应该完全相同,但由于精度损失,我实际上有 1001。如果我再去比较这些数字,它不会如果我使用相对或绝对比较并不重要(只要我以对问题和规模有意义的方式定义了比较)。
无论如何,正如 Mitch Wheat 建议的那样,算法的重新排序确实有助于解决问题。