Russian Qt Forum

Qt => Общие вопросы => Тема начата: dimka8 от Июнь 02, 2016, 23:03



Название: QT проблемы с double
Отправлено: dimka8 от Июнь 02, 2016, 23:03
доброго времени суток. возникла такая делема
Код:
QVector<double> as;
// заполнение вектора
double a=str_var.toDouble();
as.push_back(a);
// при заполнении вектора проверяем на всякий случай
ui->label->setText(QString::number(a,'f', 2));
// и записываем в .bin
QString file_save = QFileDialog::getSaveFileName(0,tr("File Save"),"","File (*.bin);;All files (*.*)");
    if(!file_save.isEmpty()){
        QFile file (file_save);
        if(file.open(QIODevice::WriteOnly)){
            double d=0;
            for(int s=0;s<as.size();s++){
                d=as.at(s);
                file.write((char*)(&d),sizeof(d));

            }
            file.close();
        }
    }
такая проблема . при проверке число 54.25  , а записывает в файл 54.249999 . как это можно исправить?


Название: Re: QT проблемы с double
Отправлено: kambala от Июнь 02, 2016, 23:43
попробуй записывать через QDataStream.

а ты через hex редактор смотришь файл или потом при чтении так выводит?


Название: Re: QT проблемы с double
Отправлено: Igors от Июнь 03, 2016, 07:41
такая проблема . при проверке число 54.25  , а записывает в файл 54.249999 . как это можно исправить?
Проблемы нет, так устроены флоты. Для проверки Вы округляете до 2 знаков, для записи нет,
Пример
Код
C++ (Qt)
if (a == a + 1)
qDebug() << "Oba-na!";
При каком "a" будет печататься  Oba-na ?  :)


Название: Re: QT проблемы с double
Отправлено: dimka8 от Июнь 03, 2016, 11:33
 С QDataStream вообще цифры не правдоподобные получаются !!  и в начале было
Код:
ui->label->setText(QString::number(a));
без убирания лишних цифр после точки " 23.450000" (возможно я не правильно понял на счет флоты) . проверяю файл в hex редакторе , причем число 45.6 записывается в файл как положено 45.60000 . да ,еще я точно знаю ,что отображение числа при проверке верное и в векторе тоже верно записано .


Название: Re: QT проблемы с double
Отправлено: Igors от Июнь 03, 2016, 12:18
проверяю файл в hex редакторе
Судя по коду стартового поста Вы пишете двоичные данные (не текст). Поэтому если в heх Вы видите "строку" - значит сам редактор ее и напечатал, используя свои правила округления. Это нормально, многие отладчики тоже не показывают флот число как оно было присвоено. Число правильное, просто округляется по-разному при переводе в текст в разных приложениях. Выведите его при чтении так же как при записи - увидите то же самое.

да ,еще я точно знаю ,что отображение числа при проверке верное
"Совершенно верно" отображаются только очень немногие флот-значения (для которых бьется степень двойки).  Для остальных хранится их ближайшее представление. Напр если Вы увидели "23.450000" - это совсем не значит "верно", там еще есть ненулевые цифры справа (просто они не печатаются). Ближайшее оказалось больше исходного. А вот для 54.25 ближайшее меньше - вот и пошли девятки


Название: Re: QT проблемы с double
Отправлено: dimka8 от Июнь 03, 2016, 14:45
то-есть это нормально и решить эту проблему невозможно ?


Название: Re: QT проблемы с double
Отправлено: __Heaven__ от Июнь 03, 2016, 14:49
Это не проблема. Это двойная точность. Можете использовать long double для повышения точности (не советую).


Название: Re: QT проблемы с double
Отправлено: __Heaven__ от Июнь 03, 2016, 14:51
Вот чтиво (https://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C). Есть ещё одна страшная проблема. double нельзя сравнивать между собой операторами ==, != :)
Запись производится как  sign * 2^exponent * mantissa


Название: Re: QT проблемы с double
Отправлено: Igors от Июнь 03, 2016, 15:49
то-есть это нормально и решить эту проблему невозможно ?
"Знову за рибу грошi" :'(  Нет никакой "проблемы" - просто 2 приложения печатают (округляют) одно и то же число по-разному

Есть ещё одна страшная проблема. double нельзя сравнивать между собой операторами ==, != :)
Да неужели?   
Код
C++ (Qt)
double a = 1.0, b = 0.25;
a /= 4;
qDebug() << (a == b);
 
Печатает true.. хмм... вроде верно  :)


Название: Re: QT проблемы с double
Отправлено: __Heaven__ от Июнь 04, 2016, 01:23
Игорь, ваши методы программирования несомненно самые лучшие! Когда уже книгу напишете?


Название: Re: QT проблемы с double
Отправлено: Igors от Июнь 04, 2016, 11:06
Игорь, ваши методы программирования несомненно самые лучшие! Когда уже книгу напишете?
Ну, вот немного освобожусь..  :)

Кстати
Это не проблема. Это двойная точность.
Двойная/тройная точность здесь ни при чем. Для double "шаг" меньше чем для float, но все равно хранимое число или больше или меньше заданного.