Умножение возвращает мне неправильные значения - PullRequest
0 голосов
/ 28 июня 2018

Я пишу код для проекта Arduino, над которым я работаю, и умножение возвращает мне неправильные значения, и я не могу понять, почему.

String calculateShutterSpeed(float fs, int i, int l){
float fstop = fs;
int iso = i;
int lux = l;
float c = 1.00;
float shutterspeedTop = 0;
double shutterspeedBottom = 0;

shutterspeedTop = pow(fs, 2)*c;
shutterspeedBottom = lux*iso;

shutterspeedBottom = shutterspeedBottom/shutterspeedTop;

Код, выдающий мне ошибку, - это строка, в которой я умножаю люкс на iso, в некоторых случаях (с небольшими числами) он работает нормально, но как только я использую большие числа, он начинает давать мне неправильные числа, такие как люкс 4833 и ISO 200 даст мне -16440.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

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

Умножение двух 2-байтовых целых чисел приводит к получению другого 2-байтового целого числа, и, если значение слишком велико для диапазона, переполняется ; это поведение, которое вы видите.

Вам придется перейти на long или, что вполне возможно, на double.

0 голосов
/ 28 июня 2018

Тип int может содержать числа до предела. В вашем случае это 2 ^ 16 = 65536 чисел, что означает, что вы можете иметь числа в диапазоне [-32,768, 32,767]. Вы можете использовать long тип для решения проблемы.

Краткое примечание: short = 2 байта long = 4 байта int = 2 байта или 4 байта (в зависимости от архитектуры)

Спасибо ChiefTwoPencils за указание на двусмысленность!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...