我在这里读到并得出结论,double的最小值(绝对值)是,1.7e-308但我的代码永远循环:
for (double d(-1.0); d <= 1.0; d+=1.7e-308)
{
}
Run Code Online (Sandbox Code Playgroud)
编辑:我想以尽可能小的增量从-1.0循环到1.0.
这个问题很简单.它与但绝对不是一个骗局有关:
看事物的数量惊人,可以去错浮点数(包括但不正确使用时不限于在不同的体系结构不同的结果,错误的结果,两年的拒绝服务崩溃的影响两种不同的语言等),我我想知道一个非常简单的问题:
在没有epsilon的情况下使用的浮点数总是代码气味或规格气味吗?
(也就是说:浮点数是否真的只能用于科学计算,其余部分应该使用固定数量的精度来完成?)
我试图找到一些Java代码来确定两个双精度数是否几乎相等。我做了很多Google搜寻,发现了我在这里拼凑而成的点点滴滴。它开始逃脱我的地方是“相对ε”的使用。这种方法似乎是我要寻找的。我不想直接指定epsilon,而是要根据两个参数的大小使用epsilon。这是我编写的代码,我需要对其进行完整性检查。(附言:我知道数学足够危险。)
public class MathUtils
{
// http://stackoverflow.com/questions/3728246/what-should-be-the-
// epsilon-value-when-performing-double-value-equal-comparison
// ULP = Unit in Last Place
public static double relativeEpsilon( double a, double b )
{
return Math.max( Math.ulp( a ), Math.ulp( b ) );
}
public static boolean nearlyEqual( double a, double b )
{
return nearlyEqual( a, b, relativeEpsilon( a, b ) );
}
// http://floating-point-gui.de/errors/comparison/
public static boolean nearlyEqual( double a, double b, double epsilon )
{
final double absA = Math.abs( a );
final double absB …Run Code Online (Sandbox Code Playgroud) 在一系列浮点算术运算之后,是否存在一个"最佳实践",而不是与浮点数相等的比较?
我在R中有以下示例,但该问题不仅适用于R,而且适用于使用浮点的任何语言.我有一个双x = 1,我应用了一系列的加法和减法.最后x应该是一个但不是由于浮点运算(从我收集的).这是一个例子
> stop_times <- seq(0.25, 2, by = .25)
> expr <- expression(replicate(100,{
x <- 1
for(i in 1:10) {
tmp <- rexp(1, 1)
n <- sample.int(1e2, 1)
delta <- tmp / n
for(j in 1:n)
x <- x - delta
x <- x + tmp
}
# "correct" answer is 4
which.max(x <= stop_times)
}))
> eval(expr)
[1] 5 5 5 4 4 4 5 5 5 4 5 4 4 4 …Run Code Online (Sandbox Code Playgroud) floating-point r floating-accuracy epsilon inexact-arithmetic
我想知道给定值附近浮点数的epsilon.
std::numeric_limits<floating_point_type>::epsilon() 提供仅适用于数字1.0,而我想要一个函数来处理任何数字.
这有什么标准库解决方案吗?如果不是 - 我应该如何实现这个功能?
检查Float.compare(f1,f2)后,我发现它比较f1f2
并返回-1,0,1.
然后,如果值为-0.0,0.0或NAN,则返回-1,0,1.
这是什么意思-0.0?
我会期待类似的东西
return (Math.abs(f1 - f2) - 0.001f) > 0)
Run Code Online (Sandbox Code Playgroud)
其中0.001是给定的epsilon值.
谢谢.
我正在学习Matlab,我不明白为什么(eps * 0.5) + 1不大于1。
eps
ans =
2.220446049250313e-16
fprintf('%.52f\n', eps);
0.0000000000000002220446049250313080847263336181640625
sign(eps)
ans =
1
% 1 means that eps is >= 0
eps >= 0
ans =
logical
1
eps > 0
ans =
logical
1
eps < 0
ans =
logical
0
% so, now I take half of eps
my_half_eps = eps * 0.5;
my_half_eps
my_half_eps =
1.110223024625157e-16
fprintf('%.52f\n', my_half_eps);
0.0000000000000001110223024625156540423631668090820312
sign(my_half_eps)
ans =
1
% half eps is positive
my_half_eps >= 0
ans …Run Code Online (Sandbox Code Playgroud) 如何在FORTRAN 90中编写一个程序来确定任何计算机中的机器epsilon?
type ErrorOrT[M[+_], A] = EitherT[M, Throwable, A]
type ErrorOr[A] = ErrorOrT[IO, A]
Run Code Online (Sandbox Code Playgroud)