Я сравниваю различные платформы и языки с простым скриптом, который эмулирует Collatz conjecture. Во время тестирования я обнаружил, что мой arduino застревает на семенах 447, где умножение int 13121 на три урожайности -26173.Ошибка умножения Arduino, + ve * + ve становится -ve
Мой исходный код был `
//made by Hugo K
//jun 13 2014
void setup()
{
Serial.begin(9600);
while (!Serial)
{
;//wait for serial to connect
}
}
void loop()
{
unsigned long starttime;
starttime = millis();
for (int i = 1; i <= 500; i++)
{
int a = i;
while (a != 1)
{
if (a%2 == 0)
{
a = a/2;
}
else
{
a = (a*3) + 1;
}
//Serial.println(a);
}
}
Serial.println(millis() - starttime);
}`
А позже подтвердил`
void setup()
{
Serial.begin(9600);
while(!Serial)
{
}
}
void loop()
{
int i = 13121;
Serial.println(i *3);
}`
Есть ли что-то не так с ATmega микроконтроллера там? или есть проблема с int 13121, которая нарушает традиционное умножение?
ему нужно беззнаковое долго, чтобы получить 32 бита, «длинный» даст ему 31 –
@OlegGryb 'long' 32 бита ... 1 знаковый бит и 31 бит точности –
, поскольку он имеет дело с положительные числа, только макс, который он может получить для «long», равен 0x7FFFFFFF, который составляет 31 бит, в то время как в случае беззнакового длинного max будет 0xFFFFFFFF (32 бит). Он потеряет один бит, если не использует неподписанные типы. –