Целочисленное деление, которое дает менее 1 - PullRequest
0 голосов
/ 26 февраля 2020

Как мы можем использовать масштабный коэффициент 1000, например, чтобы не получить 0 для a, когда мы работаем с целыми числами. Он на 32-битном микроконтроллере.

Пример:

uint32 a;
a = 211/555 * x;

Должны ли мы просто умножить все справа на 1000, а затем разделить конечный результат на 1000?

1 Ответ

3 голосов
/ 26 февраля 2020

Вы можете применить масштабный коэффициент перед выполнением деления.

В вашем примере вы эффективно делаете (предполагая, что x = 1000)

a = (211/555) * x;

, который окажется

a = 0*x;

Если вы измените его на

a =(x*211)/555;

, вы можете сначала выполнить умножение, создав числитель больше 555, который позволит a быть больше 0.

Вы не можете затем разделить этот результат на 1000, потому что он все равно будет меньше 0, что не может быть сохранено в целочисленном типе данных.

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

...