2010-02-22 14 views
7

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ı?

+0

Cevabı kabul edermisiniz, o zaman insanlar gelecekte size yardımcı olmaya daha istekli hale getirir. –

cevap

9

uzunluğunun 64 bit olması gerekmez. yerine 'uzun uzun' deneyin.

+0

Çalışıyor! Bunu öneren herkese teşekkürler. Java'yı çok daha fazla takdir etmemi sağlıyor ... – rhodri

+0

@rhodri: uzun uzun süredir 64 bit, hatta bu arada (bazı uygulamalarda). Boost Tamsayı'ya bakın veya derleyicinizin stdint.h olup olmadığını kontrol edin. – GManNickG

+1

@GMan: Doğru. Ancak, C standardı 'uzun uzun' bir 64bit tamsayı için * yeterli menzile * sahip olduğunu garanti eder ve bu genellikle yeterlidir ... – sleske

2

Muhtemelen 32 bit uzunluğunuz var. Bunun yerine long long kullanmayı deneyin. = 3221028867

98301 * 32767, 2147483648

4

tip long bir 32-bit uzunluğunda bir taşmaları, zorunlu olarak 64 bit değil ise. 32 bit mimaride iseniz (en azından MS Visual C++), long türü 32 bittir. sizeof (long) ile kontrol edin. Yardımcı olabilecek long long veri türü de vardır.

2

C standart sadece long (çoğu 32 bit platformlarda durum aslında olan) en az 32 bit olacağı garanti eder.

64 bit'e ihtiyacınız varsa, long long'u kullanın. En az 64 bit tutulması garantilidir.