Вопрос по float
- Войдите на сайт для отправки комментариев
Ср, 11/07/2018 - 16:43
Пытаюсь записать в ЕПРОМ значения типа float
Есть функция, которую я нашел у вас на форуме
Однако мне надо ограничть float до 3 символов после запятой
float aaa = 123.5457678; Write_EEPROM(0, aaa,3)
Но! компилятор ругается
Тогда попыталсязаключить aaa,3 в скобки, то вместо float появляеться int то есть 123
https://www.arduino.cc/en/Reference/EEPROMPut
Можно так. Или самому побайтно 4 раза последовательно из памяти писать в ЕЕPROM.
вы не поняли проблемы
Я не могу обрезать флоат, а мне это необходимо
Просто я не понимаю, как записать этот аргумент (кол-во чисел после запятой)
Это всё тщетно - вы его не обрежете.
Просто я не понимаю, как записать этот аргумент (кол-во чисел после запятой)
флот запишется как есть.
а вот выводить его можете как вам нужно.
вы не поняли проблемы
Я не могу обрезать флоат, а мне это необходимо
нет никакой проблемы. Обрезать флоат при хранении НЕ НУЖНО. Обрезают его при выводе на печать.
Ок, так и поступлю
Спасибо!
Однако мне надо ограничть float до 3 символов после запятой
Это невозможно.
float не содержит символов и, соответственно, не предусматривает возможности какого-либо ограничения их количества.
Как, впрочем, и не содержит такого понятия, как "количество знаков после запятой".
Все, что связано со знаками и их количеством - свойства не самого float, а строки символов, в которую мы преобразуем float для вывода на печать.
Соответственно, желаемое количество знаков можно либо указать при преобразовании float в строку, либо при редактировании готовой строки. Но к собственно float это уже не имеет никакого отношения.
Однако мне надо ограничть float до 3 символов после запятой
Это невозможно.
float не содержит символов и, соответственно, не предусматривает возможности какого-либо ограничения их количества.
Как, впрочем, и не содержит такого понятия, как "количество знаков после запятой".
Все, что связано со знаками и их количеством - свойства не самого float, а строки символов, в которую мы преобразуем float для вывода на печать.
Соответственно, желаемое количество знаков можно либо указать при преобразовании float в строку, либо при редактировании готовой строки. Но к собственно float это уже не имеет никакого отношения.
Понятно что флоат состоит из знака, мантиссы и порядка.
Возможно в нём из порядка можно можно получить сколько знаков будет до запятой.
Соответственно остальные - после.
Именно значащих цифр.
Так как их сумма до и после является постоянной.
А вот общее количество значащих цифр в десятичном представлении можно получить, только зная как мантиссу, так и порядок.
Насколько я помню в типе чисел с плавающей запятой
мантисса ВСЕГДА в диапазоне 0 - 1.
Вернее мантисса представляется как 0."и тот набор цифр"
И это как раз сделано для того чтобы не терять значащие цифры.
То есть первой цифрой мантиссы может быть
1. или 0 когда ВСЕ остальные тоже нули,
2. или 1 когда ВСЕ остальные нули,
3. или любая другая, но не 0 или 1 если остальные не 0 или 1.
Не знаю сколько места отведено под мантиссу, но думаю что количество значащих цифр постоянно.
Строго говоря, в диапазоне от 0.5 до 1.0. Если бы она была меньше 0.5, ее бы следовало сдвинуть влево и уменьшить порядок на 1.
3. или любая другая, но не 0 или 1 если остальные не 0 или 1. Не знаю сколько места отведено под мантиссу, но думаю что количество значащих цифр постоянно.
Это невозможно. В двоичной системе счисления других цифр кроме 0 и 1 нет.
Под знак отводится 1 бит, под порядок 8 бит и мантисса имеет разрядность 24 бита. Легко убедиться, что в сумме получается 33 бита. Ничего удивительного, т.к. мантисса лежит в диапазоне от 0.5 до 1.0, ее старший бит всегда 1. Значит, хранить его нет смысла. Т.е. в записи числа хранятся только 23 младших из 24 бит мантиссы.
Естественно, это только в двоичном коде. При переводе в десятичный количество значащих цифр зависит от самого числа.
Нет. Посмотрите нормальную и нормализованую форму записи. Причем для нормальной формы от 0 до <1.
Выше ответили что в данном случае мы храним число в двоичной системе исчисления соответственно для нее это верно. и эти 32 бита float жестко поделены на знак мантисcы, мантисcу , знак порядка и значение порядка.
Так
Или так
[quote=andriano]
Строго говоря, в диапазоне от 0.5 до 1.0. Если бы она была меньше 0.5, ее бы следовало сдвинуть влево и уменьшить порядок на 1.
[quote]
Это следствие того что при переводе из 10 в 2 систему числа меньше 0,5(10 система) в двоичной впереди (в старшем разряде) ноль появляется?
Это именно в компах, а не требование к мантиссе в математике?
Это следствие того что при переводе из 10 в 2 систему числа меньше 0,5(10 система) в двоичной впереди (в старшем разряде) ноль появляется?
Это именно в компах, а не требование к мантиссе в математике?
1. Не совсем понял, что Вы хотите сказать. Прмер (вся запись - в десятичной, "^" - возведение в степень): число 0.1 записывается как 0.8*2^-3.
2. Компьютерное представление позаимствовало термин "мантисса" из математики, но по существу "компьютерная" мантисса отличается от "математической".