SORU
18 HAZİRAN 2014, ÇARŞAMBA


günlük(10.0) (0.0) derleme giriş yapabilirsiniz?

Aşağıdakiler içinCkaynak kodu:

#include <math.h>

int main(void)
{
    double          x;

    x = log(0.0);

    return 0;
}

I gcc -lm, derleme var:

/tmp/ccxxANVH.o: In function `main':
a.c:(.text 0xd): undefined reference to `log'
collect2: error: ld returned 1 exit status

Ama, ben log(10.0) log(0.0) daha sonra yerini başarıyla derlemek olabilir.

Oldukça anlamıyorum, ne zamandan beri matematiksel mantıklı veya değil, sözdizimi hatası yoktur -- derleme. Biri bunu açıklayabilir mi?

Her ihtimale karşı, gcc -v benim çıkış:

Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c  ,java,go,d,fortran,objc,obj-c   --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c  /4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)

CEVAP
18 HAZİRAN 2014, ÇARŞAMBA


gcc birçok durumda builtin functions kullanabilir, kendi belgeleri söylüyor:

Onlar çok bu işlevler yalnızca belirli durumlarda optimize edilmiş; belirli bir durumda, kütüphane işlevine bir çağrı getirilmiştir olduğu verilmiş.

bu nedenle gcc olmaz lazım link karşı matematik kitaplığı kullanırken, yerleşik işlevi, ama beri log(0) not defined muhtemelen kuvvetlerigcc değerlendirmek için de çalışma zamanı'den bu yana bir yan etkisi.

draft C99 standard bölümünde 7.12.1 bakacak olursakHata koşulları tedaviparagrafta4o diyorvurgu benim):

Kayan bir sonuç matematiksel büyüklüğü eğer taşmaları sonuç sonlu ama matematiksel sonuç olamaz o kadar büyük. bir nesne olağanüstü roundoff hatasız temsil yazın belirtildi. Taşmaları ve varsayılan yuvarlama olduğunu yüzen bir sonucu eğer matematiksel sonuç tam bir sonsuzluk ise gerçekte, ya sonlu argümanlar(örneğin günlük(0.0)) işlevi makro HUGE_VAL, HUGE_VALF ya göre HUGE_VALL değer dönüş türü vardırişlevi doğru değerini olarak aynı işareti ile; eğer tamsayı ifade math_errhandling & MATH_ERRNO sıfır ise, tamsayı deyim hata değeri ERANGE kazanır;tamsayı ise ifade math_errhandling & MATH_ERREXCEPT sıfır. ‘divide-by-zero’ kayan nokta özel durum varsa ortaya çıkar matematiksel sonuç tam bir sonsuzluk ve ‘taşma’. kayan nokta özel durumu yoksa ortaya çıkar.

Canlı bir örnek -S log çağrı filtre montaj ve grep log oluşturmak için bayrağı kullanarak görebiliriz.

log(0.0) bu durumda aşağıdaki talimat oluşturulur (see it live):

call    log

ama log(10.0) durumunda call log hiçbir talimat oluşturulur, (see it live).

Genellikle muhtemelen daha hızlı bir şekilde yerleşik kullanılan olup olmadığını test etmek için -fno-builtin flag kullanarak yerleşik fonksiyonu kullanarak gcc önleyebiliriz.

Bu* needs to go after the source file*25 örneğin ( . not ^em>bağlantılı cevabı alınıreğer main.c matematik kitaplığı gerekirse o zaman kullanırsınız:

 gcc main.c -lm 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matt Steffanina

    Matt Steffan

    1 EYLÜL 2011
  • The Onion

    The Onion

    14 Mart 2006
  • TheJoeycool2010

    TheJoeycool2

    12 Temmuz 2010