我写了一个模拟器,它有一些碰撞检测代码,并在检测到碰撞时对每个对象进行了很好的数学运算.
如果这两个对象位于完全相同的位置或者在一些罕见的其他情况下,我将NaN(不是数字)作为它们在线的某个位置,我想知道在哪里.通常,如果我对整数执行这些操作,程序会崩溃,但因为+和 - 无穷大是浮点规范的一部分,所以它是允许的.
所以,沿着这条线的某个地方,我采用负数的平方根或除以零.
无论如何,我可以让我的程序自动崩溃导致这个的操作,所以我可以缩小一些吗?
Stroustrup在"C++的设计和演变"(Addison Wesley,1994)中说,"低级事件,例如算术溢出和除以零,假定由专用的低级机制而不是异常处理这使得C++能够在算术运算时匹配其他语言的行为.它还避免了在流水线严重的体系结构中出现的问题,其中除以零之类的事件是异步的.
Q1:如果不是例外,为什么GCC会报告一个而不是一个较低级别的错误?
Q2:鉴于我正在划分整数,为什么报告为浮点数?
鉴于我无法用catch(...)来捕捉它,这是非常误导的.显然我可以测试并避免整个'错误',但我的观点是,对于一个认为它可能是异常(合理)的初学者来说,它是非常混乱的,试图抓住它,然后发现它不是异常,并且对报告的运行时异常感到奇怪.
我的编译器是gcc版本4.2.1(Apple Inc. build 5666)(第3点)
准确澄清CPU异常,FPU异常,语言异常和操作系统异常之间的区别可能会解决这个问题.
示例程序:
int main(){
int i=1/0;
return i;
}
Run Code Online (Sandbox Code Playgroud)
结果输出:
浮点异常
我正在尝试使用 numpy.select 有条件地将值分配给数组。然而,使用 select 需要计算所有可能的赋值,而不仅仅是相关的赋值,这可能会导致 div/0 错误,例如:
import numpy as np
def testfunc(z):
conditionlist = [z < 0, z == 0, z > 0]
choicelist = [1 / z, 0, 1 + z]
return np.select(conditionlist, choicelist)
if __name__ == "__main__":
print testfunc(np.array([0]))
Run Code Online (Sandbox Code Playgroud)
此代码将失败并出现 div/0 错误,尽管 1 / z(其中 z = 0)实际上不需要分配给返回的数组。
如何有条件地将值分配给 numpy 数组而不遇到 div/0 错误?循环是唯一的选择吗?
在mawk中除以零时我得到六个不同的结果:
$ echo | awk '{print -1/0 }' ; echo $?
-inf
0
$ echo | awk '{print 0/0 }' ; echo $?
-nan
0
$ echo | awk '{print 1/0 }' ; echo $?
inf
0
$ echo | awk '{printf ("%i\n", -1/0) }' ; echo $?
-2147483647
0
$ echo | awk '{printf ("%i\n", 0/0) }' ; echo $?
-2147483647
0
$ echo | awk '{printf ("%i\n", 1/0) }' ; echo $?
2147483647
0
Run Code Online (Sandbox Code Playgroud)
我得到每个案例的"成功"退出代码.
我是编程的新手,我有一个除零的问题.代码中的注释中解释了问题.
public float Divide (float a, float b)
{
if (!Equals (b, 0))
return a / b;
else
return 0; // what should this return contains not to giving me back infinite?
// But for example message that you can't divide by zero?
}
Run Code Online (Sandbox Code Playgroud) public static List<int> getDenoms(long n)
{
List<int> result = new List<int>();
for (int i = 1; i < n; i++)
{
if (n % i == 0)
{
result.Add(i);
}
}
return result;
}
public static int getHighestPrime(List<int> seq)
{
int currentHigh = 1;
foreach (int number in seq)
{
List<int> temp = getDenoms(number);
if (temp.Count == 1)
{
if (number > currentHigh)
{
currentHigh = number;
}
}
}
return currentHigh;
}
Run Code Online (Sandbox Code Playgroud)
我将当前代码放在C#中.所以,我有两种方法.在getDenoms方法中,我假设语句n%i不会抛出任何错误,因为我大于或等于1,但确实会抛出该错误.
我以下列方式使用了这两种方法:
Console.WriteLine(getHighestPrime(getDenoms(600851475143)));
Run Code Online (Sandbox Code Playgroud)
有关代码抛出该错误的原因的任何见解?
I'm getting a divide by zero error when I use this function. It compiles fine. Since I'm not using a select statement I'm assuming NULLIF isn't going to work. What can I use to avoid the divide by zero issue?
OPEN GET_DATA;
fetch GET_DATA into v_gpa_hsch,v_gpa_hsch_scale,v_gpa_scale,v_gpa,
v_gpa_recalc,v_gpa_hsch_recalc;
IF GET_DATA%NOTFOUND
THEN
IT_final_final_calc :=0;
ELSE
IF v_gpa_hsch_scale < v_gpa_scale
THEN IL_higher_scale_calc := v_gpa_scale;
ELSE IL_higher_scale_calc := v_gpa_hsch_scale;
END IF;
IF v_gpa_hsch < v_gpa
THEN IM_gpa_calc := v_gpa;
ELSE IM_gpa_calc := v_gpa_hsch;
END …Run Code Online (Sandbox Code Playgroud) scala> 5 / 0
java.lang.ArithmeticException: / by zero
... 28 elided
Run Code Online (Sandbox Code Playgroud)
一个简单的算术表达式省略了二十八个帧?这些框架是什么?为什么Scala需要那么多框架来进行安全划分?为什么首先要消除它们?
我突然想到 PL/SQL 可能有一种更简洁的方法来做到这一点:
我有一个程序可以被零除,但在所有情况下我都希望它返回 0。我当前的逻辑如下所示:
if bar <> 0 then
foobar := foo/bar;
else
foobar := 0;
end if;
Run Code Online (Sandbox Code Playgroud)
有谁知道更简单/更便宜的方法来做到这一点?我对 PL/SQL 还很陌生,我看到我可以使用异常处理程序,但这似乎跳过了操作。所以我想我可以破例zero_divide然后做:
foobar := 0;
foobar := foo/bar;
Run Code Online (Sandbox Code Playgroud)
不过,我担心这并不容易遵循。感谢您的任何见解!
我的代码,我无法弄清楚我在哪里得到除零问题.
mreviewApp.cpp
const int SIZE = 80;
const char DELIMIT = '|';
void parseLine(const char line[], string& title, int& rating);
void stringTrim(char st[]);
void printMrList(std::vector <Mreview> mrList);
Mreview searchTitle(std::vector <Mreview> &mrList, string title);
int main()
{
ifstream fin;
fin.open("rating_list.txt");
if (fin.fail()) {
cerr << "Input file opening error.\n";
exit(1);
}
char line[SIZE];
string title;
int rating;
int lineCount = 0;
std::vector <Mreview> mrList;
/* Process one line at a time */
// Read the first line
fin.getline(line, SIZE);
stringTrim(line);
// …Run Code Online (Sandbox Code Playgroud)