Bunu varsayıyorum abs
ve fabs
kullanırken farklı davranıyorum math.h
. Ama sadece cmath
ve kullandığımda kullanmak std::abs
zorunda mıyım std::fabs
yoksa 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 abs
yalnızca tam sayılar üzerinde çalışır ve fabs
kayan nokta değerlerine ihtiyacınız vardır . Bunlar C ++ 'da mevcuttur (tüm C kitaplığıyla birlikte), ancak bunları kullanmaya gerek yoktur.
int
C kütüphanesinden sürümü için aşırı yükler vardır long
, float
, double
ve 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 int
linux üzerindeki sürümü kullanacaktır , bu da hata ayıklaması inanılmaz derecede zor olabilir.
Hâlâ fabs
for double
ve float
argümanlar kullanmakta sorun yok . O sağlamaktadır çünkü bu tercih ettiklerini yanlışlıkla şerit halinde std::
kapalı abs
davranış noktası girişlerini yüzen için aynı olduğunu,.
Bunun abs
yerine 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::abs
ama çıkmadı ve bunun yerine C sürümünü kullanıyordu.
Her neyse, niyetinizi açıkça belgelemenin bir yolu olarak kayan noktalı girdiler fabs
yerine kullanmanın iyi olduğuna inanıyorum abs
.
std::abs
daima çağrılan gibi görünüyor (ve değil C- versiyon abs
) ne zaman görüşmesi özelliğini abs
sürece using namespace std;
de açıklanmaktadır başlangıç. Bunun derleyiciye özgü olup olmadığını bilmiyorum.
std::fabs
Kayan 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.