Не совсем преобразует из двойной в int - кажется, проблема в инструкциях процессора - PullRequest
0 голосов
/ 29 ноября 2010

Я удивился, когда отладил свой код. Здесь я приведу пример кода

#include<QMessageBox>
#include<iostream>
#include<math.h>
#include<QApplication>
using namespace std;

class MyMessageBox: public QMessageBox
{
    public:
        MyMessageBox(string message,QWidget *parent=0) :
            QMessageBox(
                QMessageBox::NoIcon,
                QString("ErrorMessage"),
                QString(message.c_str()),
                QMessageBox::Ok,
                parent,
                Qt::Widget)
        {
        }
};

void Hai()
{
    int tempi = 4;
    double a = pow(10,tempi);
    int temp = int(pow(10,tempi));

    //int temp=a;

    MyMessageBox mb1((QString::number(pow(10,tempi))+
                      " *** "+
                      QString::number(temp)).toStdString());
    mb1.exec();
}

int main(int argc, char * argv[])
{

    QApplication app(argc,argv);
    Hai();

    return app.exec();
}

и результат:

10000 *** 9999

И главное, это происходит только для степени 4 (= pow (x, 4), а не для любых других степеней.

EDIT:

Я пробовал минимальный код в Visual Studio, но он дает ровно 10000. Но он никогда не компилировался, пока я не сделал преобразование типов явно. Код указан ниже

#include<iostream>
#include<math.h>

using namespace std;

void Hai()
{
    int tempi = 4;
    double a=pow(10.0,tempi);
    int temp=pow(10.0,tempi);

    cout << " a " << a << " temp " << temp << endl ;
}

int main(int argc, char * argv[])
{
    Hai();
    return 1;
}

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Ваша проблема в том, что результат вашей операции с плавающей запятой равен 9999,99999999 ... поэтому int(...) равен int(9999.9999999...), что, конечно, равно 9999. Поскольку операции с плавающей запятой редко бывают точными, вы не должны писать свой кодожидать, что они будут.В этом случае вы можете использовать функцию округления.

Как отмечалось в комментарии, крайне маловероятно, что ваша реализация pow(10,4) не даст положительного целого числа, поэтому ваш пример, вероятно, ошибочен.Тем не менее, точка все еще остается в силе: никогда не ожидайте, что результаты с плавающей точкой будут точными.

См. Также: Почему 1,2 * 30 = 35?

0 голосов
/ 01 декабря 2010

Нет стандарта, гарантирующего точность функции pow.Ответственные поставщики библиотек пытаются получить простые точные случаи, подобные этому, но вы не можете зависеть от этого (как показывает ваш опыт), если хотите написать хороший переносимый код.их с повторным умножением (или с библиотечной функцией, предназначенной для этой цели), а не с вызовом pow.

0 голосов
/ 30 ноября 2010

Помните, что pow (10,4), pow (10.0,4) и pow (10.0,4.0) не вызывают одну и ту же функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...