Когда необходимо использовать «float» вместо «int»?

Я совсем новичок в Arduino и делаю код для шагомера. У меня много переменных, и я использовал "int" несколько раз, но только что наткнулся на код с "float". Поскольку мой опыт программирования практически отсутствует, я не совсем понимаю концепцию float и когда его целесообразно использовать. Может ли кто-нибудь дать мне объяснение? Спасибо!

, 👍5

Обсуждение

используйте их для промежуточного деления в местах, где map() не будет работать, @dandavis


6 ответов


3

"int" означает целое число. Это либо одно целое число (простите меня, математики, за неаккуратное определение!), либо следующее или предыдущее.

«Плавающее число» — это число с плавающей точкой, то есть число и часть числа.

3 — это целое число

3.14 — это число с плавающей точкой

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

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

,

4

Целое число — это целое или натуральное число. Компьютеры используют целые числа для подсчета и сравнения. Компьютеры могут точно считать, используя целые числа, и сравнение двух целых чисел может быть абсолютно истинным или ложным.

Чтобы создать число с плавающей точкой или число с плавающей точкой, компьютер использует два целых числа. Он использует одно целое число как мантисса, а другое как показатель степени. Компьютеры используют числа с плавающей точкой для вычислений, включающих очень большие, очень маленькие или дробные значения. Другими словами, набор действительных чисел. Компьютеры не могут хорошо считать, используя числа с плавающей точкой. Компьютер даже не может хорошо сравнивать два числа с плавающей точкой. То есть вы можете получить разные результаты на разных компьютерах при проверке, являются ли два разных числа с плавающей точкой одинаковыми или нет. Это происходит из-за ошибки округления.

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

Ошибки округления — это то, что мы получаем, позволяя значениям с плавающей точкой становиться очень большими или очень маленькими или содержать дробные суммы. К счастью, числа с плавающей точкой — это именно то, что нам нужно, когда компьютеры просят вычислять очень большие, очень маленькие или дробные числа.

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

Решение вашего конкретного приложения (шагомер):

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

,

0

Есть гораздо больше подробностей по обоим типам данных, но для простоты приведем лишь приблизительное объяснение:

Типы данных

integer допускают только диапазон от -2 147 483 648 до 2 147 483 647 с 4 байтами памяти на переменную.
Если ваши результаты превышают эти цифры, произойдет переполнение или недополнение. Если вы не будете осторожны, могут произойти плохие вещи.
И вы можете использовать только целые числа, десятичной точки нет.

float вместо этого позволяет вам выполнять вычисления, напрямую вводя десятичные значения (например, 1,25, 3,14, ...), точно так же, как вы это делаете на бумаге.
Плюс: вам обычно не нужно беспокоиться о проверках диапазона, потому что этот тип данных охватывает огромный диапазон значений (от -3,4028235E+38 до 3,4028235E+38, а также всего лишь с 4 байтами памяти на переменную!

Так почему бы не использовать float по умолчанию?
Одним из больших недостатков является то, что для эффективной обработки этого числового формата требуется специальное оборудование («модуль с плавающей точкой», FPU).
Если ваш микроконтроллер не имеет FPU (а у небольших Arduino его нет), каждое вычисление с использованием операндов float требует вызова определенных функций, которые используют некоторые правила для преобразования ваших операндов float в типы данных integer, выполняют вычисление на основе integer и преобразуют результат обратно в float.
Это потребляет некоторое количество памяти и много циклов ЦП, что может замедлить скорость вычислений примерно до 1/10 по сравнению с использованием FPU.

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

«А что, если мне нужны десятичные числа?»
Вы не можете ввести 3.14 в integer, но вы можете умножить его на значение, достаточно большое, чтобы учесть достаточное количество десятичных знаков для вашего приложения. Вам просто нужно определить множитель и представить себе десятичную точку. Например, умножьте ваши значения на 1000, тогда 3,14 * 1,256 = 3,94384 внутренне станет 3140 * 1256 = 3943840.

,

0

Когда необходимо использовать «float» вместо «int»?

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

Как мне быть с числами, стоящими за запятой?

Поскольку целые числа не позволяют работать с запятой, и вы не будете использовать число с плавающей точкой, вы можете задаться вопросом, как работать с числом пи (3,1415..радиан). В большинстве случаев вы будете работать только с определенным количеством цифр после запятой. Допустим, вам нужно 3 цифры после запятой. В этом случае вы просто работаете с миллирадианами вместо радиан (3145 миллирадиан=3,145 радиан; Для американцев, возможно, пришло время взглянуть на метрическую систему для лучшего понимания)
Из-за этого изменения в "базовом значении" больше не нужны float для расчета. Есть 3 недостатка:

  • при выводе информации может потребоваться/желательно форматирование преобразовать в пользовательское «базовое значение».
  • при вводе информации может потребоваться/желательно форматирование
    преобразовать в пользовательское «базовое значение».
  • При использовании методов, использующих float, необходимы преобразования Вход и выход обычно очень малы в arduino. Serial.print(), вероятно, самая большая вещь.
    Если вам нужно использовать такой метод, как cos(), вы делаете следующее:
    длинный результат=ДЕСЯТИЧНЫЕ ЦИФРЫ*cos((плавающая точка)угол/ДЕСЯТИЧНЫЕ ЦИФРЫ);
    Где ДЕСЯТИЧНЫЕЦИФРЫ= (float)10^numdigits;

Как совет типа I, используйте long на 8 bitter, так как int (от -32 768 до 32 767) с большой вероятностью выйдет за пределы диапазона.

Больше информации о грязных деталях поплавка
Совершенно очевидно, что float поддерживает значения после запятой, но в чем недостаток float?

  • float интенсивно использует ЦП/ОЗУ
  • float создает проблему округления.
  • несколько типов int/float могут вызвать проблемы с приведением типов

Давайте рассмотрим недостатки один за другим:
float интенсивно использует ЦП/ОЗУ
IMHO Во многих проектах Arduino остается достаточно ресурсов ЦП/ОЗУ, поэтому я не думаю, что это реальная проблема.
Чтобы доказать это, посмотрите, сколько проектов Arduino содержат задержку (x00) в цикле; так что если все идет слишком медленно, просто уменьшите это число, чтобы освободить несколько циклов ЦП ;-).

float создает проблему округления.
*При использовании чисел с плавающей точкой A * B / A не гарантирует, что будет равно B!!!* Это будет близко, но ...
Это мой главный аргумент, чтобы избегать поплавков. Рано или поздно это ударит по вам, и вам будет трудно понять, почему. (Я говорю по опыту)
В принципе 0.1 не может быть представлено на 100% точно в float. Так что в float 0.1+0.2 не равно 0.3!!!

множественные типы int/float могут вызвать проблемы с приведением типов В C/C++ довольно сложно предсказать приведение типов, которое произойдет в такой формуле:

float z;
byte r;
uint32 t;
...
int a=z*r/t*1.5;

Я считаю себя очень опытным в C/C++ и всегда преобразую такой код во что-то вроде

float z;
byte r;
uint32 t;
...
byte rfloat=r;
uint32 tfloat=t;
int a=(int)(z*rfloat/tfloat*1.5);

Я предпочитаю не объяснять это новичку в Arduino :-s.
Более подробную информацию можно найти на сайте floating-point-gui.de

,

0

Я новичок в Arduino и сейчас пишу код для шагомера.

< /цитата>

другие ответили на разницу между float и int.

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

Вместо использования чисел с плавающей точкой можно использовать многобайтовые типы. Например, 32-битный/4-байтовый тип может поддерживать 2 миллиона миль; можно добавить к нему дополнительный старший бит, чтобы создать собственный тип данных. Например, 5-байтовый тип будет поддерживать 5 миллионов миль, а 6-байтовый тип — 128 миллиардов миль.

Вам нужно будет создать свои собственные математические процедуры -> совсем не сложно.

дело в том, что float — это простое решение только простых проблем.

,

0

int означает Целое число а float обозначает число с плавающей точкой. Для получения дополнительной информации посетите https://www.arduino.cc/reference/en/language/variables/data-types/float/

,