Mam dziwny problem z C++, gdzie długi typ danych przepełnia się na długo przed tym powinien. Co robię (z dotychczasowym sukcesem) to, że liczby całkowite zachowują się jak pływaki, więc zakres [-32767,32767] jest odwzorowany na [-1,0,0]. Gdzie natyka się z większymi argumenty reprezentujące płynie większy niż 1,0:C++ długo przelewa się przedwcześnie
inline long times(long a, long b) {
printf("a=%ld b=%ld ",a,b);
a *= b;
printf("a*b=%ld ",a);
a /= 32767l;
printf("a*b/32767=%ld\n",a);
return a;
}
int main(void) {
printf("%ld\n",times(98301l,32767l));
}
Co otrzymuję jako wyjście jest:
a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775
-32775
So razy (98301,32767) jest analogiczna do 3.0 * 1.0. Ten kod działa doskonale, gdy argumenty do czasów są mniejsze niż 32767 (1.0), ale żaden z pośrednich kroków z powyższymi argumentami nie powinien przepełnić 64 bitów długości.
Wszelkie pomysły?
Czy akceptujesz odpowiedź, to sprawia, że ludzie chętniej pomogą ci w przyszłości. –