C++ c+的不同输出+;pi近似

C++ c+的不同输出+;pi近似,c++,C++,可能重复: 在我的64位ubuntu计算机上,以下代码按预期工作,并返回两种算法的近似pi。然而,在实验室机器上,我必须演示代码,一个32位rhel 3机器,第二个算法总是返回4,我不知道为什么。如有任何见解,将不胜感激 /* * RandomNumber.h * * * */ #ifndef RANDOMNUMBER_H_ #define RANDOMNUMBER_H_ class RandomNumber { public: RandomNumber() {

可能重复:

在我的64位ubuntu计算机上,以下代码按预期工作,并返回两种算法的近似pi。然而,在实验室机器上,我必须演示代码,一个32位rhel 3机器,第二个算法总是返回4,我不知道为什么。如有任何见解,将不胜感激

/*
 * RandomNumber.h
 *
 *  
 *      
 */

#ifndef RANDOMNUMBER_H_
#define RANDOMNUMBER_H_

class RandomNumber {
public:
RandomNumber() {
    x = time(NULL);
    m = pow(2, 31); //some constant value
    M = 65915 * 7915; //multiply of some simple numbers p and q
    method = 1;
}
RandomNumber(int seed) {
    x = ((seed > 0) ? seed : time(NULL));
    m = pow(2, 31); //some constant value
    method = 1; //method number
    M = 6543 * 7915; //multiply of some simple numbers p and q
}
void setSeed(long int seed) {
    x = seed; //set start value
}

void chooseMethod(int method) {
    this->method = ((method > 0 && method <= 2) ? method : 1); //choose one of two method
}

long int linearCongruential() { //first generator, that uses linear congruential method
    long int c = 0; // some constant
    long int a = 69069; //some constant
    x = (a * x + c) % m; //solution next value
    return x;
}

long int BBS() { //algorithm Blum - Blum - Shub
    x = (long int) (pow(x, 2)) % M;
    return x;
}
double nextPoint() { //return random number in range (-1;1)
    double point;
    if (method == 1) //use first method
        point = linearCongruential() / double(m);
    else
        point = BBS() / double(M);
    return point;
}
private:
long int x; //current value
long int m; // some range for first method
long int M; //some range for second method
int method; //method number
};

#endif /* RANDOMNUMBER_H_ */
/*
*随机数
*
*  
*      
*/
#ifndef随机数_
#定义随机数_
类随机数{
公众:
随机数(){
x=时间(空);
m=pow(2,31);//某个常数值
M=65915*7915;//一些简单数字p和q的乘积
方法=1;
}
随机数(整数种子){
x=((种子>0)?种子:时间(NULL));
m=pow(2,31);//某个常数值
method=1;//方法编号
M=6543*7915;//一些简单数字p和q的乘积
}
无效固定种子(长整型种子){
x=种子;//设置开始值
}
无效选择方法(int方法){

此->方法=((方法>0&&method在
BBS()
中截断为
long
会导致生成相同的“随机”数


PS.
pow
函数返回的是一个数字,它太大,无法在计算机的
long
类型中表示。当转换到
long
时,这会导致未定义的行为。未定义行为的一个特殊影响可能是转换为
0x8000000
0x7fffffff
因此您会得到一个相同数字的序列。

问题是
pow
返回一个
双精度
,这在低端会丢失精度。对于
%
运算符,转换为
长整数
总是返回相同的结果,因此您的RNG输出常量-60614748

x = time(0)                 1354284781
pow(x, 2)                  1.83409e+18   0x1.973fdc9dc7787p+60
(long int) pow(x, 2)       -2147483648    0x80000000
(long int) pow(x, 2) % M     -60614748
修复方法是将
x=(long int)(pow(x,2))%M;
更改为
x=x*x%M
,执行
long int
中的所有算术。请注意,严格来说,这仍然是不正确的,因为没有定义有符号溢出;更正确的方法是使用
无符号long

x = time(0)                 1354284781
pow(x, 2)                  1.83409e+18   0x1.973fdc9dc7787p+60

32位int的值最大为2^31-1,x^2的值大于该值。

通常,
long
在32位体系结构上是32位,在64位体系结构上是64位。也许你与此有冲突?@JoachimPileborg类似,但答案是错误的,我不再使用参数来设置值,这就是问题所在仍然存在。然后请取消接受已接受的答案,并改为编辑旧问题。编辑问题将碰撞它,因此它不会在“噪音”中丢失@chill你能详细说明一下吗?有趣的是,这会不断地将输出从4.000更改为3.99480左右,任何事情都可能发生,因为正如@ecatmur自己所指出的,这仍然会触发未定义的行为。
x = time(0)                 1354284781
pow(x, 2)                  1.83409e+18   0x1.973fdc9dc7787p+60