Вопрос по float

Dima-chan
Offline
Зарегистрирован: 11.07.2018

Пытаюсь записать в ЕПРОМ значения типа float 
Есть функция, которую я нашел у вас на форуме
Однако мне надо ограничть float до 3 символов после запятой 

float aaa = 123.5457678;
Write_EEPROM(0, aaa,3)

Но! компилятор ругается
Тогда попыталсязаключить aaa,3 в скобки, то вместо float появляеться int то есть 123

 

nik182
Offline
Зарегистрирован: 04.05.2015

https://www.arduino.cc/en/Reference/EEPROMPut

Можно так. Или самому побайтно 4 раза последовательно из памяти писать в ЕЕPROM.

Dima-chan
Offline
Зарегистрирован: 11.07.2018

вы не поняли проблемы 
Я не могу обрезать флоат, а мне это необходимо

Dima-chan
Offline
Зарегистрирован: 11.07.2018

Просто я не понимаю, как записать этот аргумент (кол-во чисел после запятой)

sadman41
Offline
Зарегистрирован: 19.10.2016

Это всё тщетно - вы его не обрежете.

vvadim
Offline
Зарегистрирован: 23.05.2012

Dima-chan пишет:

Просто я не понимаю, как записать этот аргумент (кол-во чисел после запятой)

флот запишется как есть.

а вот выводить его можете как вам нужно.

b707
Offline
Зарегистрирован: 26.05.2017

Dima-chan пишет:

вы не поняли проблемы 
Я не могу обрезать флоат, а мне это необходимо

нет никакой проблемы. Обрезать флоат при хранении НЕ НУЖНО. Обрезают его  при выводе на печать.

Dima-chan
Offline
Зарегистрирован: 11.07.2018

Ок, так и поступлю
Спасибо!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Dima-chan пишет:

Однако мне надо ограничть float до 3 символов после запятой 

Это невозможно.

float не содержит символов и, соответственно, не предусматривает возможности какого-либо ограничения их количества. 

Как, впрочем, и не содержит такого понятия, как "количество знаков после запятой".

Все, что связано со знаками и их количеством - свойства не самого float, а строки символов, в которую мы преобразуем float для вывода на печать.

Соответственно, желаемое количество знаков можно либо указать при преобразовании float в строку, либо при редактировании готовой строки. Но к собственно float это уже не имеет никакого отношения.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

andriano пишет:

Dima-chan пишет:

Однако мне надо ограничть float до 3 символов после запятой 

Это невозможно.

float не содержит символов и, соответственно, не предусматривает возможности какого-либо ограничения их количества. 

Как, впрочем, и не содержит такого понятия, как "количество знаков после запятой".

Все, что связано со знаками и их количеством - свойства не самого float, а строки символов, в которую мы преобразуем float для вывода на печать.

Соответственно, желаемое количество знаков можно либо указать при преобразовании float в строку, либо при редактировании готовой строки. Но к собственно float это уже не имеет никакого отношения.


Понятно что флоат состоит из знака, мантиссы и порядка.
Возможно в нём из порядка можно можно получить сколько знаков будет до запятой.
Соответственно остальные - после.
Именно значащих цифр.
Так как их сумма до и после является постоянной.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

trembo пишет:
Понятно что флоат состоит из знака, мантиссы и порядка. Возможно в нём из порядка можно можно получить сколько знаков будет до запятой. Соответственно остальные - после. Именно значащих цифр. Так как их сумма до и после является постоянной.
Ну, если нам нужно вывести число в двоичном представлении, то так и есть.

А вот общее количество значащих цифр в десятичном представлении можно получить, только зная как мантиссу, так  и порядок.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Насколько я помню в типе чисел с плавающей запятой
мантисса ВСЕГДА в диапазоне 0 - 1.
Вернее мантисса представляется как 0."и тот набор цифр"
И это как раз сделано для того чтобы не терять значащие цифры.

То есть первой цифрой мантиссы может быть
1. или 0 когда ВСЕ остальные тоже нули,
2. или 1 когда ВСЕ остальные нули,
3. или любая другая, но не 0 или 1 если остальные не 0 или 1.
Не знаю сколько места отведено под мантиссу, но думаю что количество значащих цифр постоянно.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

trembo пишет:
Насколько я помню в типе чисел с плавающей запятой мантисса ВСЕГДА в диапазоне 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 бит мантиссы.

Естественно, это только в двоичном коде. При переводе в десятичный количество значащих цифр зависит от самого числа.

sva_khv
Offline
Зарегистрирован: 19.12.2016

trembo пишет:
Насколько я помню в типе чисел с плавающей запятой мантисса ВСЕГДА в диапазоне 0 - 1.

Нет. Посмотрите нормальную и нормализованую форму записи.  Причем для нормальной формы от 0 до <1.

trembo пишет:
Не знаю сколько места отведено под мантиссу, но думаю что количество значащих цифр постоянно.

Выше ответили что в данном случае мы храним число в двоичной системе исчисления соответственно для нее это верно.  и эти 32 бита float жестко поделены на знак мантисcы, мантисcу , знак порядка и значение порядка.

Так

Или так

 

sva_khv
Offline
Зарегистрирован: 19.12.2016

[quote=andriano]

Строго говоря, в диапазоне от 0.5 до 1.0. Если бы она была меньше 0.5, ее бы следовало сдвинуть влево и уменьшить порядок на 1.

[quote]

Это следствие того что при переводе из 10 в 2 систему числа меньше 0,5(10 система) в двоичной впереди (в старшем разряде) ноль появляется?  

Это именно в компах,  а не требование к мантиссе в математике?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sva_khv]</p> <p>[quote=andriano]</p> <p>Строго говоря, в диапазоне от 0.5 до 1.0. Если бы она была меньше 0.5, ее бы следовало сдвинуть влево и уменьшить порядок на 1.</p> <p>[quote пишет:

Это следствие того что при переводе из 10 в 2 систему числа меньше 0,5(10 система) в двоичной впереди (в старшем разряде) ноль появляется?  

Это именно в компах,  а не требование к мантиссе в математике?

1. Не совсем понял, что Вы хотите сказать. Прмер (вся запись - в десятичной, "^" - возведение в степень): число 0.1 записывается как 0.8*2^-3.

2. Компьютерное представление позаимствовало термин "мантисса" из математики, но по существу "компьютерная" мантисса отличается от "математической".