У меня странная проблема с C ++, когда длинный тип данных переполняется задолго до того, как должен. Что я делаю (пока с успехом), так это чтобы целые числа вели себя как числа с плавающей точкой, чтобы диапазон [-32767,32767] отображался в [-1.0,1.0] Где он спотыкается, с большими аргументами, представляющими числа с плавающей запятой, больше чем 1.0:
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));
}
Что я получаю в качестве вывода:
a=98301 b=32767 a*b=-1073938429 a*b/32767=-32775
-32775
То есть время (98301,32767) аналогично 3,0 * 1,0. Этот код прекрасно работает, когда аргументы для времен меньше 32767 (1.0), но ни один из промежуточных шагов с приведенными выше аргументами не должен превышать 64 бита.
Есть идеи?