Bunu varsayıyorum absve fabskullanırken farklı davranıyorum math.h. Ama sadece cmathve kullandığımda kullanmak std::abszorunda mıyım std::fabsyoksa fabs? Yoksa bu tanımlanmadı mı?
Yanıtlar:
C ++ 'da kullanmak her zaman yeterlidir std::abs; tüm sayısal türler için aşırı yüklenmiş.
C'de absyalnızca tam sayılar üzerinde çalışır ve fabskayan nokta değerlerine ihtiyacınız vardır . Bunlar C ++ 'da mevcuttur (tüm C kitaplığıyla birlikte), ancak bunları kullanmaya gerek yoktur.
intC kütüphanesinden sürümü için aşırı yükler vardır long, float, doubleve long double. Madde 26.2.7 aynı zamanda için bir aşırı yük tanımlar complex.
std::ve sadece kullanırsanız abs, kodunuz Windows'ta beklendiği gibi çalışacaktır ancak intlinux üzerindeki sürümü kullanacaktır , bu da hata ayıklaması inanılmaz derecede zor olabilir.
Hâlâ fabsfor doubleve floatargümanlar kullanmakta sorun yok . O sağlamaktadır çünkü bu tercih ettiklerini yanlışlıkla şerit halinde std::kapalı absdavranış noktası girişlerini yüzen için aynı olduğunu,.
Bunun absyerine kendi hatamdan dolayı, bu sorunu çözmek için 10 dakika harcadım std::abs. Bunun using namespace std;çıkarım yapacağını varsaydım std::absama çıkmadı ve bunun yerine C sürümünü kullanıyordu.
Her neyse, niyetinizi açıkça belgelemenin bir yolu olarak kayan noktalı girdiler fabsyerine kullanmanın iyi olduğuna inanıyorum abs.
std::absdaima çağrılan gibi görünüyor (ve değil C- versiyon abs) ne zaman görüşmesi özelliğini abssürece using namespace std;de açıklanmaktadır başlangıç. Bunun derleyiciye özgü olup olmadığını bilmiyorum.
std::fabsKayan noktalı girdileri açıkça önermek için bir neden daha var .
<cmath> eklemeyi unutursanız, yerine sizin std::abs(my_float_num)olabilir . Fark etmesi zor.std::abs(int)std::abs(float)
"abs" ve "fabs", belirsiz aşırı yükleme mesajları olmadan çevrilebildiklerinde, yalnızca C ++ kayan tipler için aynıdır.
G ++ (g ++ - 7) kullanıyorum. Şablon kullanımıyla birlikte ve özellikle mpreal kullanırken, zor "belirsiz aşırı yükleme" mesajlarının olduğu durumlar vardır - her zaman bunu çözmez abs(static_cast<T>(x)). Mutlak belirsiz olduğunda, fabrikaların beklendiği gibi çalışma şansı vardır. Sqrt için böyle basit bir kaçış bulamadım.
Haftalardan beri C ++ "mevcut sorunlar değil" konusunda çok mücadele ediyorum. Eskisinden daha fazla ve daha iyi şablon kullanımı için eski bir C ++ programını C ++ 14'e güncelliyorum. Çoğunlukla aynı şablon parametresi gerçek herhangi bir standart kayan nokta veya karmaşık tür veya bir sınıf türü olabilir. Neden, uzun çift, diğer türlerden biraz daha mantıklı davrandı. Her şey çalışıyordu ve daha önce mpreal'ı dahil etmiştim. Sonra varsayılan float tipimi mpreal olarak ayarlıyordum ve bir yığın sözdizimi hatası aldım. Bu, örneğin abs ve sqrt için, farklı çözümler için ağlayan binlerce belirsiz aşırı yüklemeye neden oldu. Bazılarının aşırı yüklenmiş yardım işlevlerine ihtiyacı vardı, ancak bir şablonun dışında. Tek tek bin adet 0.0L ve 1.0L kullanımı, Sıfır veya Bir veya bir type_cast kullanarak tam sabit tip ile değiştirmek zorundaydı - belirsizlikler nedeniyle otomatik dönüşüm tanımı imkansız.
Mayıs ayına kadar, örtük dönüşümlerin varlığını çok güzel buldum. Ama çok daha basitti ve herhangi bir standart sabit tip için güvenli açık tip_castsli tipave sabitlere sahip olmak çok daha basit olurdu.