比较两个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)
似乎浪费处理.
有谁知道更聪明的浮动比较器?
我已经尝试搜索一个javascript函数,它将检测两条线是否相互交叉.
该函数将获取每一行的两个起始端点的x,y值(我们称之为A行和B行).
如果相交则返回true,否则返回false.
功能示例.如果答案使用矢量对象,我很高兴.
Function isIntersect (lineAp1x, lineAp1y, lineAp2x, lineAp2y, lineBp1x, lineBp1y, lineBp2x, lineBp2y)
{
// JavaScript line intersecting test here.
}
Run Code Online (Sandbox Code Playgroud)
一些背景信息:这段代码是我想在html5画布中制作的游戏,也是我碰撞检测的一部分.
javascript intersection collision-detection line-intersection
请看以下两个代码:
public static void main(String... args)
{
System.out.println(0.5==0.5f);
}
Run Code Online (Sandbox Code Playgroud)
输出:true
public static void main(String... args)
{
System.out.println(0.1==0.1f);
}
Run Code Online (Sandbox Code Playgroud)
输出:false
为什么会这样?
到目前为止,我已经看到很多关于浮点数相等的帖子.对于"我们应该如何决定x和y是否相等?"这样的问题的标准答案.是
abs(x - y) < epsilon
Run Code Online (Sandbox Code Playgroud)
其中epsilon是一个固定的小常数.这是因为"操作数"x和y通常是涉及舍入误差的某些计算的结果,因此标准相等运算符==不是我们的意思,我们应该问的是x和y是否接近,不相等.
现在,我觉得如果x与y"几乎相等",那么x*10 ^ 20也应该与y*10 ^ 20"几乎相等",因为相对误差应该是相同的(但是"相对的" "到底是什么?" 但是对于这些大数字,上述测试将失败,即该解决方案不会"扩展".
你会如何处理这个问题?我们应该重新调整数字还是重新调整epsilon?怎么样?(或者我的直觉是错的吗?)
这是一个相关的问题,但我不喜欢它接受的答案,因为reinterpret_cast对我来说似乎有点棘手,我不明白发生了什么.请尝试提供简单的测试.
可能重复:
我应该如何进行浮点比较?
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) 我试图了解开关在飞镖中是如何工作的.我有非常简单的代码:
methodname(num radians) {
switch (radians) {
case 0:
// do something
break;
case PI:
// do something else
break;
}
}
Run Code Online (Sandbox Code Playgroud)
遗憾的是,这不起作用.如果保留为此错误是:case表达式必须具有相同的类型(我的类型是num,但不是编辑器).如果我将0更改为0.0则表示:切换类型表达式double不能覆盖==运算符 - 我不知道这意味着什么!
那么切换案例的方法是什么?我可以将它转换为if/else可能但我想知道如何使开关工作,为什么它不起作用.
我正在运行最新的DartEditor稳定版本.
请有人可以帮忙吗?
我刚刚阅读了有关浮点值比较的声明
不能使用==或!=运算符比较浮点值.大多数浮点值没有精确的二进制表示,并且精度有限.
如果是这样,比较两个浮点值的最佳方法是什么?
您好我知道计算机受数字精度的限制,有些数字无法在二进制系统中准确表示.这就是我问为什么这样比较的原因
(0.1*3) == 0.3
Run Code Online (Sandbox Code Playgroud)
在Java语言中评估为false在C中它评估为true,对我来说Java行为更直观一些.任何提供的答案都不能回答我的问题,为什么他们有不同的行为,因为两者都使用IEEE 754标准.
@update我正在使用ideone来测试条件.
我是 C 新手,目前正在研究数组。我想检查某个值是否在数组中,但我遇到了一些问题(不仅在语法方面,而且在理解方面)。
我的目标是有一个我可以调用的函数,给它两个参数——要搜索的值和要搜索的数组——并根据它是否被找到返回一个 0 或 1。
我的方法如下:
#include <stdio.h>
#include <stdlib.h>
int valueinarray(float val, float *arr[]);
int main()
{
float arr[] = {5, 4.5, 4, 3.5, 3, 2.5,};
int test = valueinarray(4.5, *arr[]);
printf("%d", test);
return 0;
}
int valueinarray(float val, float *arr[]){
int i;
for(i = 0; i < sizeof(*arr[]); i++){
if(*arr[i] == val) return 1;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我现在有两个问题,特别是关于语法的问题:
如果我创建一个带有指针作为其参数之一的函数,我是否必须一直在函数内部使用“*arr[]”来引用它?还是“arr[]”甚至“arr”就足够了?
我是否正确理解我无法将整个数组传递给函数所以我改用指针?
此外,我的方法是错误的,我不明白为什么。迭代数组似乎工作得很好,甚至检查某个值是否在其中也有效,问题似乎出在我调用函数的方式上。我读过双指针,这是需要它们的场景吗?如果不是,他们需要什么?
非常感谢。
我在寻找亚马逊的面试问题时想到了这个问题.
给定一个数字,如何在一系列浮点数据中找到最接近的数字?
如果一切都是整数,则answer减去数组中每个数字的数字,然后在数组中查找具有最小绝对值的元素.
但是当谈到浮点时,它应该是高度非暴力的.
阿尼的想法?谢谢.
algorithm ×2
c ×2
comparison ×2
java ×2
.net ×1
arrays ×1
c# ×1
c++ ×1
dart ×1
intersection ×1
javascript ×1
literals ×1
math ×1
optimization ×1
php ×1
syntax ×1