0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
||||||
1 | ||||||
Что происходит с лишними байтами double при сравнении с меньшим по размеру float?06.12.2017, 16:57. Показов 788. Ответов 18
Метки нет (Все метки)
Всем привет, специально создал в разделе для новичков, ибо звучит сие глупейше..
итак немного теории, все мы знаем, что float это 4 байта, а double 8 из этого следуя мы понимаем, что присваивая значение: float a = 1.0; в памяти у нас занимаются 4 байта, и по идее там 1.000000 (6 знаков после запятой) с double соответственно. а теперь магический вопрос:
0
|
06.12.2017, 16:57 | |
Ответы с готовыми решениями:
18
float to double. Как происходит приведение типов? Ошибка при сравнении double и регулярного выражения Float imprecision - что происходит? Float или Double: что и в каком случае использовать |
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
||||||
06.12.2017, 17:01 | 2 | |||||
Если коротко, то потому, что
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
06.12.2017, 17:02 [ТС] | 3 |
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
06.12.2017, 17:02 | 4 |
П.С. У меня выводит только equals
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
06.12.2017, 17:12 [ТС] | 5 |
это и значит что они равны, но какого ?
Добавлено через 6 минут да, похоже надо уточнить. Вопрос в том, почему они равны?
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
06.12.2017, 17:13 | 6 |
Опять же, если кратко 44.47647f не имеет точного представления в float выражении. Поэтому компилятор вместо него подставляет ближайшее, оладающее таким представлением. То есть, числа, изначально то как раз были равны.
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
06.12.2017, 17:16 [ТС] | 7 |
в смысле не имеет точного представления? куда точнее? скастуйте а к double результат один они равны о_О
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
06.12.2017, 17:18 | 8 |
http://rextester.com/SPDYU56709
Добавлено через 1 минуту Вы не сможете найти такую комбинацию битов в объекте типа float, чтобы результат его интерпретации оказался вточности равен 44.47647. Довольно типичная проблема при переходе между системами счисления.
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
06.12.2017, 17:55 [ТС] | 9 |
да я и не спорю, но у нас значение числа в 4х байтах не может быть равно числу в 8 байтах, и уж темболее заполненным.
и я никак не возьму в толк, почему при касте влота в дабл, я получаю то-же значение, хотя поидее там должны быть нули.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
||||||
06.12.2017, 18:29 | 10 | |||||
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|||||||||||
06.12.2017, 18:31 | 11 | ||||||||||
А чтоб "по идее там должны быть нули" - сделай вот так:
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
06.12.2017, 18:34 | 12 |
Проблема в том, что вы думаете в десятичной системе счисления. Числа, записанные в десятичной системе счисления не всегда красиво выглядят в двоичной и наоборот.
Как вам, например, (double)0.9: 0011111111101100110011001100110011001100110011001100110011001101
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
06.12.2017, 18:35 | 13 |
Только я уверен что ни в
*(reinterpret_cast<float *>(&b)) , ни в a2 никакого значения наподобие 44.47647 не будет. Потому что https://ru.wikipedia.org/wiki/... й_точности vs https://ru.wikipedia.org/wiki/... й_точности - имеют ну совершенно разное разбиение по битам.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|
06.12.2017, 18:55 | 14 |
При сранении бинарного представления надо помнить, что мантиса double сдвинута относительно float, а также не забыть про little endian
0
|
06.12.2017, 19:51 | 15 |
Просто так совпало. Вы выбрали числа до и после приведения типа.
Проверить двоичное и 16-ричное представление можно здесь: https://babbage.cs.qc.cuny.edu... cimal.html Никогда не сравнивайте числа с плавающей точкой операцией == или !=. Возможно даже вот такое: https://www.cyberforum.ru/blog... g4674.html
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
07.12.2017, 08:54 [ТС] | 16 |
0
|
07.12.2017, 09:11 | 17 |
Вы вовсе не float с double сравниваете.
Перед сравнением, оба операнда приводятся к одинаковому типу. Точнее один, который float, приводится к double. При приведении от float к double, 44.4764709 превращается в 44.476470947265625. Но это число у вас уже есть и, очевидно, получено оно именно таким приведением типа. Поэтому операнды и в двоичном виде эквивалентны. Никакой магии.
0
|
0 / 0 / 0
Регистрация: 26.01.2016
Сообщений: 45
|
|
07.12.2017, 09:19 [ТС] | 18 |
Да, я понимаю, что при сравнении компилятор сам кастит типы, тут дело в другом, я почитал всю инфу что накидали, немного прояснилось, но самое главное, ответ крылся в кастах, самое интересное, это если преобразовать оба числа в HEX то они будут разные =) и даже битовые виды абсолютно разные. я помню, что у компилятора, есть настройка строгой типизации, похоже надо бы ее включить.
0
|
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
|
|||||||||||
07.12.2017, 12:17 | 19 | ||||||||||
Я выше приводил представления наших пациентов в бинарном коде:
Мантисы задают дробную часть и также равны.
0
|
07.12.2017, 12:17 | |
07.12.2017, 12:17 | |
Помогаю со студенческими работами здесь
19
Записать в железку значение float, но тремя байтами Казусы с double и float при преобразовании в string Разные результаты при расчетах с float и double Почему при преобразования из float в double коверкается число? При смене Float на double программа выдает нули Ошибка округления при использовании float или double Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |