Чем отличается прошивка NodeMCU Integer от Float?

Я спрашивал себя, в чем разница между целочисленными и плавающими прошивками и как с ними бороться. Все, что я смог найти до сих пор, это:

целочисленная версия, которая поддерживает только целочисленные операции, и версия с плавающей запятой, которая содержит поддержку вычислений с плавающей запятой.

Хорошо, пока все хорошо, но что это значит в реальной жизни?

Что происходит, когда я вычисляю

a = 3/2

Для версии с плавающей запятой я ожидаю a = 1.5 Для целочисленной версии я ожидаю a = 1. Или будет равно 2 или выдает ошибку, сбой или что-то еще? Я знаю, я мог бы просто запустить целочисленную версию и попробовать, но я также хотел бы обсудить это, чтобы получить ответ здесь. :)

Какие еще существуют ограничения/различия? Основная причина, по которой я спрашиваю: я пытался запустить некоторые скрипты в целочисленной версии без каких-либо операций с плавающей запятой, о которых я знаю, и некоторых функций просто нет. С версией с плавающей запятой все работает как положено.

Обновлять:

Вот фрагмент, который дает неожиданный результат:

local duration = (now - eventStart)

продолжительность равна 0 с целочисленной прошивкой. Я предполагаю, что это потому, что теперь eventStart слишком велик для целого числа:

now: 1477651622514913
eventStart: 1477651619238587

Поэтому я бы сказал, что другие ограничения заключаются в том, что целочисленная версия поддерживает только целочисленные операции с 31-битными значениями, потому что когда я конвертирую

now = tonumber(now)

теперь = 2147483647, что равно 2^31 - 1

так в целой прошивке

1477651622514913 - 1477651619238587 = 0

такой же как

2147483647 - 2147483647

что очевидно 0


person Michi    schedule 27.10.2016    source источник


Ответы (2)


Вопросы и ответы разработчиков NodeMCU говорят: "целочисленные сборки имеют меньший размер Flash и выполняются быстрее, но работа с целыми числами также имеет ряд подводных камней"

Вы обнаружили некоторые подводные камни, связанные с ограничениями размера 32-разрядного целого числа со знаком.
Не знаю, какие могут быть другие, отдельные программные модули могут иметь свои собственные.

«меньше»: обычно около 13 КБ разницы в окончательных сборках версии 1.5.4.1 всего 369-478 КБ

"быстрее": здесь сравнение целых чисел и чисел с плавающей запятой операций с исходным кодом теста, если вы хотите запустить свой собственный. Итого: операции с целыми числами почти в 8 раз быстрее. Разница может быть меньше, если числа с плавающей запятой представляют собой целые числа.

person kaay    schedule 14.02.2018

Вы сами дали ответ на свой вопрос. Целочисленная версия не поддерживает операции с плавающей запятой и не позволяет использовать нецелые числа.

В целочисленной версии 3/2 равно 1, а не 1,5.

Я мог бы просто прошить целочисленную версию и попробовать, но я также хотел бы обсудить это. :)

Stack Overflow — это сайт вопросов и ответов, поэтому он не очень подходит для дискуссий. Используйте для этого форумы NodeMCU на esp8266.com.

person Marcel Stör    schedule 27.10.2016
comment
Спасибо за ответ на эту часть вопроса. Существуют ли другие различия или ограничения, и если нет, то каковы возможные причины, по которым сценарии работают с числом с плавающей запятой, а не с целым числом? - person Michi; 27.10.2016
comment
Я не могу думать о других причинах, но не видя кода, мы не можем сказать. - person Marcel Stör; 28.10.2016