Örneğin,
int result;
result = 125/100;
veya
result = 43/100;
Sonuç her zaman bölümün tabanı mı olacak? Tanımlanan davranış nedir?
"I just throw the dam fraction part in the trash and move on with life"
Örneğin,
int result;
result = 125/100;
veya
result = 43/100;
Sonuç her zaman bölümün tabanı mı olacak? Tanımlanan davranış nedir?
"I just throw the dam fraction part in the trash and move on with life"
Yanıtlar:
Sonuç her zaman bölümün tabanı mı olacak? Tanımlanan davranış nedir?
Evet, iki işlenenin tamsayı bölümü.
6.5.5 Çarpımsal operatörler
6 Tamsayılar bölündüğünde, / operatörünün sonucu, kesirli kısımları atılmış olan cebirsel bölümdür. 88) a / b bölümü temsil edilebilirse, (a / b) * b + a% b ifadesi a değerine eşit olacaktır.
ve ilgili dipnot:
88) Buna genellikle `` sıfıra doğru kesme '' denir.
Elbette dikkat edilmesi gereken iki nokta:
3 Normal aritmetik dönüşümler işlenenler üzerinde gerçekleştirilir.
ve:
5 / operatörünün sonucu, birinci işlenenin ikinciye bölünmesinden alınan bölümdür; % operatörünün sonucu kalanıdır. Her iki işlemde de, ikinci işlenenin değeri sıfırsa, davranış tanımsızdır.
[Not: Vurgu madeni]
(a / b) * b + a % b == a
tatmin edilmesi gerekiyordu ve mutlak değeri a % b
vardı az olması a
, ancak olmadığını a % b
negatif için negatifti a
veya b
belirtilmedi.
Dirkgently, C99'da tamsayı bölümünün mükemmel bir açıklamasını verir , ancak C89'da negatif bir işlenen ile tamsayı bölümünün uygulama tanımlı bir yöne sahip olduğunu da bilmelisiniz.
ANSI C taslağından (3.3.5):
İşlenenlerden herhangi biri negatifse, / işlecinin sonucunun,% işlecinin sonucunun işareti gibi, cebirsel bölümden daha küçük en büyük tamsayı mı yoksa cebirsel bölümden daha büyük en küçük tamsayı mı uygulama tanımlıdır. A / b bölümü gösterilebilirse, (a / b) * b + a% b ifadesi a değerine eşit olacaktır.
Bir C89 derleyicisine takılı kaldığınızda negatif sayılara dikkat edin.
C99'un sıfıra doğru kesmeyi seçmesi eğlenceli bir gerçek çünkü FORTRAN bunu böyle yaptı. Bkz bu mesajı comp.std.c. üzerinde
reliable integer division
yeni bir dil özelliği olarak bahsediyor . İnanılmaz *-*
.
expr1 / expr2
ve expr1 % expr2
her iki örnek expr1
de aynı nesneleri aynı şekilde ve aynı şekilde birleştirdiğinde expr2
, ancak aynı zamanda, kesilmiş ve katlanmış bölme seçiminin aksi belirtilmedikçe birbiriyle tutarlı olması gerekirdi . Bu, çok fazla uyumluluğu bozmadan daha verimli kod oluşturulmasına izin verirdi (ve uygulamalar eğimli ise belirli davranışları belgeleyebilir)
Sonucun negatif olduğu yerlerde, C yer kaplaması yerine 0'a doğru kısalır - Python tamsayı bölümünün neden her zaman buraya katlandığı hakkında bu okumayı öğrendim: Python'un Tamsayı Bölümü Zeminleri
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
değişen değerleri ile yinelenen value
. Zaman sabiti olan birinci dereceden bir düşük geçiş filtresine güzel bir tamsayı yaklaşımı yapar k
... ancak bölme kesilirse ve carry
negatif değerler alırsa sadece simetriktir . Bölme için her iki davranış da zaman zaman işe yarar.
div
katlanmış bir bölme işleci ise ve factor
tuhafsa, o zamana filtered += (filter+(factor div 2)) div factor
kadar olan tüm değerler için temiz ve simetrik davranış sağlar INT_MAX-(factor div 2)
.
Evet, sonuç her zaman sıfıra doğru kesilir. En küçük mutlak değere doğru yuvarlanır.
-5 / 2 = -2
5 / 2 = 2
İmzasız ve negatif olmayan işaretli değerler için bu, zemin ile aynıdır (-Infinity'e yuvarlama).
Sonuç her zaman bölümün tabanı mı olacak?
Hayır. Sonuç değişir, ancak varyasyon yalnızca negatif değerler için gerçekleşir.
Tanımlanan davranış nedir?
Tamsayı bölme sıfıra doğru yuvarlanırken (kesmeler) kat mermilerini negatif sonsuza doğru netleştirmek için
Pozitif değerler için aynı
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Negatif değer için bu farklı
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
İnsanların sorunuzu cevapladığını biliyorum, ama sıradan terimlerle:
5 / 2 = 2
// hem 5 hem de 2 tamsayı ve tamsayı bölümü her zaman ondalık sayıları kısaltır
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// burada 5 veya 2 veya her ikisinin ondalık değeri vardır, bu nedenle alacağınız bölüm ondalık olur.