деление на 100 не равно умножению на 0.01

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

dimax пишет:

kisoft пишет:
В последнем варианте, почему int32_t, а не long? Какая цель? Типа сэкономить на спичках? Не знаю как сделает компилятор, но чисто как это выглядит, получится два приведения типов, сначала к int32_t, потом результат к long. Это нормально?

 long и int32_t  разве это не одно и тоже ??? 

Буквы разные. Я вроде бы объяснил "но чисто как это выглядит, получится два приведения типов". long и int32_t - это разные типы. Пусть где-то они определены одинаково и занимают одинаковый объем (цитирую исходник: typedef signed long int int32_t;). Но далеко не во всех МК long === int32_t. Далеко ходить не нужно, вот для 32-битников: typedef   signed           int int32_t;

Что мешает написать long n = (long)a + 2; ? Либо, если нравится int32_t n = (int32_t)a + 2;. Цель какая? (уже спрашивал, но ответа не получил). Почему нужно писать разные буквы long n = (int32_t)a + 2;? Может я ошибаюсь? (Только не надо говорить, что это только для примера, название такого кода я уже не раз повторил).

Если непонятно, то, боюсь, мне не удастся объяснить.

PS Я понимаю, что бывают программисты распиз"яи, бывают педанты и прочее, потому прочитав тему каждый будет писать по-своему и грабли будут у каждого свои, се ля ви.

 

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

kisoft пишет:

andriano, "багофича", есть такое слово :)

 

Вот-вот.

Этот термин и появился вследствие широкого распространения в ПО ошибок проектирования, которые разработчик не хочет (или не может) признавать ошибками.

arduinec
Offline
Зарегистрирован: 01.09.2015

Valera19701 пишет:

берем число float с двумя знаками после запятой , умножаем на 100

напрмер float c = 25.89;

int16_t f = c * 100

получаем целое число  f =2589 - тут все нормально

пытаемся вернуть число float обратно

float d = 0;

d = f/100 - и получаем 26.00 - неправильное значение , почемуто округляется

d = f * 0.01 - и получаем правильное значение 25.89

И чего тут непонятного.

В первом случае целое число f делится на целое число 100. Получается целый результат, который при присваивании преобразуется в float.

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

Советы дали правильные: либо d=f/100.0 , либо d=(float)f/100 (можно и так d=(float)f/100.0).

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

arduinec пишет:

И чего тут непонятного.

а вы вопрос поняли, или поверхностно пробежали, читайте внимательно, и не только первый пост, прежде чем ответить

arduinec
Offline
Зарегистрирован: 01.09.2015

Valera19701 пишет:

arduinec пишет:

И чего тут непонятного.

а вы вопрос поняли, или поверхностно пробежали, читайте внимательно, и не только первый пост, прежде чем ответить

А вы ответ поняли? Из него следует, что другие посты я прочитал.

Если интересует ответ на вопрос:

Valera19701 пишет:

получается языку c++ не свойствены законы математики?

то язык Си и контроллеры интерпретируют законы математики по-своему.

Например: школьное правило "от перемены мест слагаемых сумма не меняется" в некоторых случаях в Си и контроллерах не работает.