88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
1

Double to int, результат на 1 меньше ожидаемого

09.05.2015, 19:30. Показов 2368. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
в программе были такие строчки кода:
C++
1
2
3
double a = 89.0;
int b = a;
qDebug() << a << " " << b;
в b почему то записывалось 88, вместо 89
сделал так:
C++
1
2
3
double a = 89.0;
int b = (float)a;
qDebug() << a << " " << b;
в b, как и должно, записывается 89. Первый вариант в моем проекте не работает правильно, но в новом - результат правильный. Что это вообще такое?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.05.2015, 19:30
Ответы с готовыми решениями:

For power int double что за результат?
Не понимаю что не так, помогите(((( #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Неверный результат при преобразования типов данных static_cast<int>(double)
Доброго времени суток, уважаемые программисты! Перейду сразу к сути проблемы: При данном значении...

Ошибка при вводе кол-ва строк меньше ожидаемого
ожидаем введение 5 строчек символов но ввели 4 как понять что ввели 4 и вывести ошибку?...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их...

13
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.05.2015, 19:37 2
в float число 89 может хранится как 88,99999998 или 89,000000002
1
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
09.05.2015, 19:42  [ТС] 3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
в float число 89 может хранится как 88,99999998 или 89,000000002
каким образом там появляется дробная часть если:
C++
1
double а = 89.0
?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.05.2015, 19:43 4
Хулиган, а какой компилятор, ОС, процессор? Вообще-то, такого быть не должно.
1
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
09.05.2015, 19:49  [ТС] 5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Хулиган, а какой компилятор, ОС, процессор? Вообще-то, такого быть не должно
mingw4.9.1_32, Windows7_32, Intel
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.05.2015, 19:55 6
На ум приходит либо различие опций компилятора (не представляю какими можно добиться такого результата), либо ошибка в программе (повреждение стека), или ошибка в компиляторе. Надо смотреть что нагенерировал компилятор и как это выполняется.
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
09.05.2015, 20:12  [ТС] 7
grizlik78, grizlik78, вот код в котором если а в диапазоне от 1.63 до 7.89 то результат на 1 меньше будет:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <cmath>
 
int main(int argc, char *argv[])
{
    double a = 1.63;
    int b = a * 100.0;
 
    std::cout << a << " " << b;
}
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.05.2015, 20:17 8
Ну вот. 89.0 и 1.63 это совсем не одно и то же. 89.0 хранится в представлении double точно, а 1.63 приближённо. Поэтому 1.63*100 не обязано равняться 163.0, если не делать округлений.

Добавлено через 32 секунды
А я-то думал... Эх...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
09.05.2015, 20:21 9
я таких ТС насквозь вижу)))
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
09.05.2015, 20:33  [ТС] 10
grizlik78, rikimaru2013,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <cmath>
 
int main(int argc, char *argv[])
{
    double a, tmp, source = 7.89;
 
    a = modf(source, &tmp);   // дробная часть запис. в - a; 
    a *= 100;
 
    std::cout << a << std::endl;    // 89
 
    int b = a;
 
    std::cout << a << " " << b;    //89  88  ?? как?
}
Добавлено через 51 секунду
в студии 13 тоже самое
0
Модератор
Эксперт С++
13532 / 10777 / 6423
Регистрация: 18.12.2011
Сообщений: 28,777
09.05.2015, 20:37 11
От приближенных значений плавающего формата никуда не денешься.
Поэтому предлагаю написать
C++
1
source = 7.89000001;
1
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
09.05.2015, 20:44  [ТС] 12
zss, так работает, но почему при a *= 100; имеем 89, а при присваивании инту теряется единица. как я понимаю в А хранится не 89, а 88.9999999, поток вывода округляет результат до 89 и вводит меня в заблуждение??
0
4 / 4 / 2
Регистрация: 08.06.2014
Сообщений: 89
09.05.2015, 20:46 13
Хулиган, у тебя все значения приближенные, .89, и т.д., отсюда все проблемы.
Насколько я помню, стандарт определяет округление к нулю, поэтому да, ты получишь 0 в случае 0,999

Особенности округления в IEEE754:
Округление до ближайшего в стандарте сделано не так как мы привыкли. Математически показано, что если 0,5 округлять до 1 (в большую сторону), то существует набор операций, при которых ошибка округления будет возрастать до бесконечности. Поэтому в IEEE754 применяется правило округления до четного. Так, 12,5 будет округлено до 12, а 13,5 – до 14.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
09.05.2015, 21:17 14
Лучший ответ Сообщение было отмечено Хулиган как решение

Решение

Хулиган, давай добавим в программу одну строчку, которая, надеюсь, ответит на вопрос.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <cmath>
 
int main(int argc, char *argv[])
{
    std::cout.precision(20);
    double a, tmp, source = 7.89;
 
    a = modf(source, &tmp);   // дробная часть запис. в - a; 
    a *= 100;
 
    std::cout << a << std::endl;    // 89
 
    int b = a;
 
    std::cout << a << " " << b;    //89  88  ?? как?
}
1
09.05.2015, 21:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2015, 21:17
Помогаю со студенческими работами здесь

При умножении значения double на int и присвоения его результата на double, результат выходит неправильным
Здравствуйте. Есть такая проблема. При умножении значения double на int и присвоения его результата...

Написать функцию int Search ( double A[], int n , double x), которая находит в массиве double A[n] элемент, значение которого равно x
Написать функцию int Search ( double A, int n , double x), которая находит в массиве double A...

Результат функции отличается от ожидаемого
Здравствуйте. вопрос по функции find. строка Wq1best1(i,:) = - должна найти наименьшего элемента...

Результат команды sub отличается от ожидаемого
mov rbp,rsp mov rax, const1 mul a1 div const2 mov rax, const2 mul e1 mov r10, rax mov...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru