Russian Qt Forum
Ноябрь 23, 2024, 19:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT проблемы с double  (Прочитано 8616 раз)
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 . как это можно исправить?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Июнь 02, 2016, 23:43 »

попробуй записывать через QDataStream.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 03, 2016, 07:41 »

такая проблема . при проверке число 54.25  , а записывает в файл 54.249999 . как это можно исправить?
Проблемы нет, так устроены флоты. Для проверки Вы округляете до 2 знаков, для записи нет,
Пример
Код
C++ (Qt)
if (a == a + 1)
qDebug() << "Oba-na!";
При каком "a" будет печататься  Oba-na ?  Улыбающийся
Записан
dimka8
Гость
« Ответ #3 : Июнь 03, 2016, 11:33 »

 С QDataStream вообще цифры не правдоподобные получаются !!  и в начале было
Код:
ui->label->setText(QString::number(a));
без убирания лишних цифр после точки " 23.450000" (возможно я не правильно понял на счет флоты) . проверяю файл в hex редакторе , причем число 45.6 записывается в файл как положено 45.60000 . да ,еще я точно знаю ,что отображение числа при проверке верное и в векторе тоже верно записано .
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Июнь 03, 2016, 12:18 »

проверяю файл в hex редакторе
Судя по коду стартового поста Вы пишете двоичные данные (не текст). Поэтому если в heх Вы видите "строку" - значит сам редактор ее и напечатал, используя свои правила округления. Это нормально, многие отладчики тоже не показывают флот число как оно было присвоено. Число правильное, просто округляется по-разному при переводе в текст в разных приложениях. Выведите его при чтении так же как при записи - увидите то же самое.

да ,еще я точно знаю ,что отображение числа при проверке верное
"Совершенно верно" отображаются только очень немногие флот-значения (для которых бьется степень двойки).  Для остальных хранится их ближайшее представление. Напр если Вы увидели "23.450000" - это совсем не значит "верно", там еще есть ненулевые цифры справа (просто они не печатаются). Ближайшее оказалось больше исходного. А вот для 54.25 ближайшее меньше - вот и пошли девятки
« Последнее редактирование: Июнь 03, 2016, 12:30 от Igors » Записан
dimka8
Гость
« Ответ #5 : Июнь 03, 2016, 14:45 »

то-есть это нормально и решить эту проблему невозможно ?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Июнь 03, 2016, 14:49 »

Это не проблема. Это двойная точность. Можете использовать long double для повышения точности (не советую).
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Июнь 03, 2016, 14:51 »

Вот чтиво. Есть ещё одна страшная проблема. double нельзя сравнивать между собой операторами ==, != Улыбающийся
Запись производится как  sign * 2^exponent * mantissa
« Последнее редактирование: Июнь 03, 2016, 14:54 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Июнь 03, 2016, 15:49 »

то-есть это нормально и решить эту проблему невозможно ?
"Знову за рибу грошi" Плачущий  Нет никакой "проблемы" - просто 2 приложения печатают (округляют) одно и то же число по-разному

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

Сообщений: 2130



Просмотр профиля
« Ответ #9 : Июнь 04, 2016, 01:23 »

Игорь, ваши методы программирования несомненно самые лучшие! Когда уже книгу напишете?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июнь 04, 2016, 11:06 »

Игорь, ваши методы программирования несомненно самые лучшие! Когда уже книгу напишете?
Ну, вот немного освобожусь..  Улыбающийся

Кстати
Это не проблема. Это двойная точность.
Двойная/тройная точность здесь ни при чем. Для double "шаг" меньше чем для float, но все равно хранимое число или больше или меньше заданного.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.