Беззнаковые длинные длинные отличные результаты - PullRequest
0 голосов
/ 24 апреля 2019

Почему я получил:

34458730320

3446590374

если я запустил:

#include <stdio.h>

int main()
{
    printf("%llu\n",10248428203192896360LLU/594823321LLU*2LLU);
    printf("%llu\n",2LLU*10248428203192896360LLU/594823321LLU);
    return 0;
}

Я ожидал, что второе правильно (проверено вMathematica, Matlab).

1 Ответ

1 голос
/ 24 апреля 2019

Целочисленное значение

2LLU * 10248428203192896360LLU

переполняет 64 бита, и компилятор должен предупредить об этом. Первое правильно

10248428203192896360LLU / 594823321LLU * 2LLU 

потому что деление является точным без остатка, поэтому не имеет значения удвоение после деления.

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