比较两个double或两个float值的最有效方法是什么?
简单地这样做是不正确的:
bool CompareDoubles1 (double A, double B)
{
return A == B;
}
Run Code Online (Sandbox Code Playgroud)
但是像这样:
bool CompareDoubles2 (double A, double B)
{
diff = A - B;
return (diff < EPSILON) && (-diff < EPSILON);
}
Run Code Online (Sandbox Code Playgroud)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
我正在编写一些代码,其中包含以下内容:
double a = SomeCalculation1();
double b = SomeCalculation2();
if (a < b)
DoSomething2();
else if (a > b)
DoSomething3();
Run Code Online (Sandbox Code Playgroud)
然后在其他地方我可能需要做平等:
double a = SomeCalculation3();
double b = SomeCalculation4();
if (a == 0.0)
DoSomethingUseful(1 / a);
if (b == 0.0)
return 0; // or something else here
Run Code Online (Sandbox Code Playgroud)
简而言之,我有很多浮点数学正在进行,我需要对条件进行各种比较.我无法将其转换为整数数学,因为在这种情况下这样的事情毫无意义.
我以前读过浮点比较可能不可靠,因为你可以做这样的事情:
double a = 1.0 / 3.0;
double b = a + a + a;
if ((3 * a) != b)
Console.WriteLine("Oh no!");
Run Code Online (Sandbox Code Playgroud)
简而言之,我想知道:我如何可靠地比较浮点数(小于,大于,相等)?
我使用的数字范围大致是从10E-14到10E6,所以我确实需要使用小数字和大数字.
我已将此标记为语言无关,因为无论我使用何种语言,我都对如何实现此目标感兴趣.
C++ FAQ lite "[29.17]为什么我的浮点比较不起作用?" 建议这个相等测试:
#include <cmath> /* for std::abs(double) */
inline bool isEqual(double x, double y)
{
const double epsilon = /* some small number such as 1e-5 */;
return std::abs(x - y) <= epsilon * std::abs(x);
// see Knuth section 4.2.2 pages 217-218
}
Run Code Online (Sandbox Code Playgroud)
+0和-0?|x| < epsilon?更新
正如Daniel Daranas所指出的那样,最好调用函数isNearlyEqual(我关心的是这种情况).
有人指出了这个链接,我想更加突出地分享.
C#中的以下代码不起作用:
int iValue = 0;
double dValue = 0.0;
bool isEqual = iValue.Equals(dValue);
Run Code Online (Sandbox Code Playgroud)
那么,问题是:比较Double和Int的最佳方法是什么?
可能重复:
我应该如何进行浮点比较?
php整数和浮点数比较不匹配
我有两个变量,$_REQUEST['amount']并且$carttotal,在电子商务的事情.当然,它们在尝试处理付款时应该匹配,以防止在最后一分钟手动覆盖支付金额,或者当然是计算错误.
然而:
$carttotal = $carttotal * 1;
$_REQUEST['amount'] = $_REQUEST['amount'] * 1;
if($carttotal != $_REQUEST['amount']) {
$code = 0; // cart empty under this user - cannot process payment!!!
$message = 'The cart total of ' . $carttotal . ' does not match ' . $_REQUEST['amount'] . '. Cannot process payment.';
$amount = $carttotal;
$json = array('code' => $code,
'message' => $message,
'amount' => $amount);
die(json_encode($json));
} else {
$trnOrderNumber = $client->id . …Run Code Online (Sandbox Code Playgroud) 比较IEEE浮点数和双精度数据的最佳方法是什么?我听说过几种方法,但我想看看社区的想法.
我正在尝试为该tan功能找到正确的域名,我知道
tan x = sinx / cos x
Run Code Online (Sandbox Code Playgroud)
并且tan未定义时cos x = 0.所以
我想检查是否cos x 为0.
if ( Math.Cos(x).Equals(0) )
{
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但这绝不是真的,因为Math.Cos返回6.123....E-17
如何检查cos == 0?
我正在从Apple JSON(应用程序的评级)解析一些东西,我尝试了类似的东西:
if ([StoreParse objectForKey:@"averageUserRating"] == @"4.5") {
NSLog(@"xx");
} else {
NSLog(@"xxx");
}
Run Code Online (Sandbox Code Playgroud)
该应用程序的评级为4.5,如果我这样做
NSlog (@"%@", [StoreParse objectForKey:@"averageUserRating"]);
Run Code Online (Sandbox Code Playgroud)
输出为:4.5
但是当我运行脚本时,第一个代码输出中的NSlog是"xxx",有人可以帮助我吗?
c# ×2
c++ ×2
algorithm ×1
cocoa ×1
cocoa-touch ×1
comparison ×1
double ×1
equals ×1
inequality ×1
int ×1
objective-c ×1
optimization ×1
php ×1
variables ×1