【发布时间】:2012-03-10 11:43:24
【问题描述】:
正在使用 mingw 在 windows 上进行项目:
C:\Users\...>g++ -dumpversion
4.5.0
当我在 g++ v 4.2.4 下编译代码时,我遇到了分段错误 - 几个小时后,我将其固定到该行:
double decimal = ((double) rand()) / (RAND_MAX + 1);
由于某种原因,这给出了负值(一件事导致另一件事)。 什么原因?
编辑:cpp:
#include <iostream>
#include "Random.h"
#include <math.h>
using namespace std;
double Random::exponential(int T) {
double decimal = ((double) rand()) / (RAND_MAX + 1);
// std::cout << "decimal : " << decimal << std::endl;
return log(1 - decimal)*(-T);
}
//etc
h:
#ifndef RANDOM_H
#define RANDOM_H
#include <cstdlib>
#include <math.h>
class Random {
public:
static double exponential(int T);
static int random_int(int min, int max);
static bool coin(); //50% true 50% false
};
#endif /* RANDOM_H */
刚刚注意到(math.h)的双重包含,但这应该不是问题
【问题讨论】:
-
这不应该正常发生。 rand() 的声明方式可能存在一些问题。
-
不要在 C++ 中使用不安全的 C 风格转换(永远)。尝试使用 static_cast 或其他东西,看看效果如何。
-
@John - 你能详细说明一下吗?
-
不要在 C++ 中这样做:
(double) rand()。相反,请执行static_cast<double>(rand())之类的操作。原因是 C 风格的强制转换是不安全的,它对编译器说“我不在乎这个表达式看起来多么愚蠢,只要按照我说的方式将这些部分混合在一起即可。” C++ 风格转换做一些更具体的事情,如果表达式没有意义(例如 static_casting a pointer into a double or something)会给出错误。 -
@JohnZwinck C 风格的转换在转换数字类型时是非常安全的,因为它们无论如何都会变成
static_casts