C++ ile uzun veri türünün gerektiği kadar uzun süre taşırken tuhaf bir sorun yaşıyorum. Yaptığım şey (şimdiye kadar başarı ile) tamsayıların yüzen gibi davranması, böylece [-32767,32767] aralığının [-1.0,1.0] ile eşleştirilmesidir. Nerede sendeler büyük argümanlar temsil ile 1,0'dan yüksek yüzen: Ne çıktı olarak almak olduğunuC++ uzun zamandır taşan uzun süre önce
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
Yani kez (98301,32767) 3.0 * 1.0 benzer. Bu kod, zamana karşı argümanlar 32767'den (1.0) daha az olduğunda mükemmel çalışır, ancak yukarıdaki argümanlarla ara adımların hiçbiri 64 bit uzunluğa taşmamalıdır.
Herhangi bir fikrin var mı?
Cevabı kabul edermisiniz, o zaman insanlar gelecekte size yardımcı olmaya daha istekli hale getirir. –