2010-02-22 29 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.

İlgili konular