Dukungan matematika dan titik mengambang
Pustaka Universal C Runtime (UCRT) menyediakan banyak fungsi pustaka matematika integral dan floating-point, termasuk semua fungsi yang diperlukan oleh ISO C99. Fungsi floating-point diimplementasikan untuk menyeimbangkan performa dengan kebenaran. Karena menghasilkan hasil yang dibulatkan dengan benar mungkin sangat mahal, fungsi-fungsi ini dirancang untuk secara efisien menghasilkan perkiraan yang dekat dengan hasil yang dibulatkan dengan benar. Dalam kebanyakan kasus, hasil yang dihasilkan berada dalam +/-1 ULP (satuan presisi paling sedikit) dari hasil yang dibulatkan dengan benar, meskipun mungkin ada kasus di mana ada ketidakakuratan yang lebih besar.
Untuk ISO C Standard 11 (C11) dan yang lebih baru, <tgmath.h>
header, selain menyertakan <math.h>
dan <complex.h>
, menyediakan makro yang memanggil fungsi matematika yang sesuai berdasarkan jenis parameter. Lihat Matematika generik jenis untuk detailnya.
Banyak fungsi pustaka matematika titik mengambang memiliki implementasi yang berbeda untuk arsitektur CPU yang berbeda. Misalnya, CRT x86 32-bit mungkin memiliki implementasi yang berbeda dari CRT x64 64-bit. Selain itu, beberapa fungsi mungkin memiliki beberapa implementasi untuk arsitektur CPU tertentu. Implementasi yang paling efisien dipilih secara dinamis pada run-time tergantung pada set instruksi yang didukung oleh CPU. Misalnya, dalam CRT x86 32-bit, beberapa fungsi memiliki implementasi x87 dan implementasi SSE2. Saat berjalan pada CPU yang mendukung SSE2, implementasi SSE2 yang lebih cepat digunakan. Saat berjalan pada CPU yang tidak mendukung SSE2, implementasi x87 yang lebih lambat digunakan. Karena implementasi yang berbeda dari fungsi pustaka matematika dapat menggunakan instruksi CPU yang berbeda dan algoritma yang berbeda untuk menghasilkan hasilnya, fungsi dapat menghasilkan hasil yang berbeda di seluruh CPU. Dalam kebanyakan kasus, hasilnya berada dalam +/-1 ULP dari hasil yang dibulatkan dengan benar, tetapi hasil aktual dapat bervariasi di seluruh CPU.
Microsoft C/C++ dan Microsoft Visual C++ versi 16-bit sebelumnya mendukung jenis sebagai long double
jenis data floating-point presisi 80-bit. Dalam versi Visual C++yang lebih baru, long double
jenis data adalah jenis data floating-point presisi 64-bit yang identik dengan jenis tersebut double
. Kompiler memperlakukan long double
dan double
sebagai jenis yang berbeda, tetapi long double
fungsinya identik dengan rekan-rekan mereka double
. CRT menyediakan long double
versi fungsi matematika untuk kompatibilitas kode sumber ISO C99, tetapi perhatikan bahwa representasi biner mungkin berbeda dari kompilator lain.
Rutinitas matematika dan floating-point yang didukung
Rutin | Gunakan |
---|---|
abs , labs , llabs , _abs64 |
Menghitung nilai absolut dari jenis bilangan bulat |
acos , acosf , acosl |
Menghitung kosinus busur |
acosh , acoshf , acoshl |
Menghitung kosinus busur hiperbolik |
asin , asinf , asinl |
Menghitung sinus busur |
asinh , asinhf , asinhl |
Menghitung sinus busur hiperbolik |
atan , atanf , atanl , atan2 , atan2f , atan2l |
Menghitung tangen busur |
atanh , atanhf , atanhl |
Menghitung tangen busur hiperbolik |
_atodbl , _atodbl_l |
Mengonversi string khusus lokal menjadi double |
atof , _atof_l |
Mengonversi string menjadi double |
_atoflt , _atoflt_l , _atoldbl , _atoldbl_l |
Mengonversi string khusus lokal ke float atau long double |
cbrt , cbrtf , cbrtl |
Menghitung akar kubus |
ceil , ceilf , ceill |
Menghitung langit-langit |
_chgsign , _chgsignf , _chgsignl |
Menghitung inversi aditif |
_clear87 , _clearfp |
Mendapatkan dan menghapus register status floating-point |
_control87 , _controlfp , __control87_2 |
Mendapatkan dan mengatur kata kontrol floating-point |
_controlfp_s |
Versi aman dari _controlfp |
copysign , copysignf , copysignl , _copysign , _copysignf , _copysignl |
Mengembalikan nilai yang memiliki besaran satu argumen dan tanda yang lain |
cos , cosf , cosl |
Menghitung sinus |
cosh , coshf , coshl |
Menghitung sinus hiperbolik |
div , ldiv , lldiv |
Menghitung kuota dan sisa dua nilai bilangan bulat |
_ecvt , ecvt |
Mengonversi menjadi double string |
_ecvt_s |
Versi aman dari _ecvt |
erf , erff , erfl |
Menghitung fungsi kesalahan |
erfc , erfcf , erfcl |
Menghitung fungsi kesalahan pelengkap |
exp , expf , expl |
Menghitung eksponensial ex |
exp2 , exp2f , exp2l |
Menghitung eksponensial 2x |
expm1 , expm1f , expm1l |
Menghitung ex-1 |
fabs , fabsf , fabsl |
Menghitung nilai absolut dari jenis floating-point |
_fcvt , fcvt |
Mengonversi angka floating-point menjadi string |
_fcvt_s |
Versi aman dari _fcvt |
fdim , fdimf , fdiml |
Menentukan perbedaan positif antara dua nilai |
feclearexcept |
Menghapus pengecualian floating-point yang ditentukan |
fegetenv |
Menyimpan lingkungan floating-point saat ini |
fegetexceptflag |
Mendapatkan status pengecualian floating-point yang ditentukan |
fegetround |
Mendapatkan mode pembulatan titik mengambang |
feholdexcept |
Mengatur mode pengecualian titik mengambang tanpa henti |
feraiseexcept |
Menaikkan pengecualian floating-point yang ditentukan |
fesetenv |
Mengatur lingkungan floating-point saat ini |
fesetexceptflag |
Mengatur bendera status floating-point yang ditentukan |
fesetround |
Mengatur mode pembulatan titik mengambang yang ditentukan |
fetestexcept |
Menentukan bendera status pengecualian titik mengambang mana yang diatur |
feupdateenv |
Memulihkan lingkungan titik mengambang lalu memunculkan pengecualian sebelumnya |
floor , floorf , floorl |
Menghitung lantai |
fma , fmaf , fmal |
Menghitung multiply-add yang menyatu |
fmax , fmaxf , fmaxl |
Menghitung maksimum argumen |
fmin , fminf , fminl |
Menghitung minimum argumen |
fmod , fmodf , fmodl |
Menghitung sisa titik mengambang |
_fpclass , _fpclassf |
Mengembalikan klasifikasi nilai floating-point |
fpclassify |
Mengembalikan klasifikasi nilai floating-point |
_fpieee_flt |
Mengatur handler untuk pengecualian floating-point |
_fpreset |
Mereset lingkungan floating-point |
frexp , frexpf , frexpl |
Mendapatkan mantissa dan eksponen dari angka floating-point |
_gcvt , gcvt |
Mengonversi angka floating-point menjadi string |
_gcvt_s |
Versi aman dari _gcvt |
_get_FMA3_enable , _set_FMA3_enable |
Mendapatkan atau mengatur bendera untuk penggunaan instruksi FMA3 pada x64 |
hypot , hypotf , hypotl , _hypot , _hypotf , _hypotl |
Menghitung hipotenus |
ilogb , ilogbf , ilogbl |
Menghitung eksponen base-2 bilangan bulat |
imaxabs |
Menghitung nilai absolut dari jenis bilangan bulat |
imaxdiv |
Menghitung kuota dan sisa dua nilai bilangan bulat |
isfinite , _finite , _finitef |
Menentukan apakah nilai terbatas |
isgreater , isgreaterequal , isless , islessequal , islessgreater , isunordered |
Membandingkan urutan dua nilai titik pecahan |
isinf |
Menentukan apakah nilai floating-point tidak terbatas |
isnan , _isnan , _isnanf |
Menguji nilai floating-point untuk NaN |
isnormal |
Menguji apakah nilai floating-point terbatas dan bukan subnormal |
_j0 , _j1 , _jn |
Menghitung fungsi Bessel |
ldexp , ldexpf , ldexpl |
Komputasi x*2n |
lgamma , lgammaf , lgammal |
Menghitung logaritma alami dari nilai absolut fungsi gamma |
llrint , llrintf , llrintl |
Membulatkan nilai floating-point ke nilai terdekat long long |
llround , llroundf , llroundl |
Membulatkan nilai floating-point ke nilai terdekat long long |
log , logf , logl , log10 , log10f , log10l |
Menghitung logaritma alami atau base-10 |
log1p , log1pf , log1pl |
Menghitung logaritma alami 1+x |
log2 , log2f , log2l |
Menghitung logaritma base-2 |
logb , logbf , logbl , _logb , _logbf |
Mengembalikan eksponen dari nilai floating-point |
lrint , lrintf , lrintl |
Membulatkan nilai floating-point ke nilai terdekat long |
_lrotl , _lrotr |
Memutar nilai bilangan bulat ke kiri atau kanan |
lround , lroundf , lroundl |
Membulatkan nilai floating-point ke nilai terdekat long |
_matherr |
Penangan kesalahan matematika default |
__max |
Makro yang mengembalikan nilai yang lebih besar dari dua nilai |
__min |
Makro yang mengembalikan nilai yang lebih kecil dari dua nilai |
modf , modff , modfl |
Membagi nilai floating-point menjadi bagian pecahan dan bilangan bulat |
nan , nanf , nanl |
Mengembalikan nilai NaN yang diam |
nearbyint , nearbyintf , nearbyintl |
Mengembalikan nilai yang dibulatkan |
nextafter , nextafterf , nextafterl , _nextafter , _nextafterf |
Mengembalikan nilai floating-point berikutnya yang dapat diwakili |
nexttoward , nexttowardf , nexttowardl |
Mengembalikan nilai floating-point berikutnya yang dapat diwakili |
pow , powf , powl |
Mengembalikan nilai dari x y |
remainder , remainderf , remainderl |
Menghitung sisa kuota dari dua nilai floating-point |
remquo , remquof , remquol |
Menghitung sisa dua nilai bilangan bulat |
rint , rintf , rintl |
Membulatkan nilai floating-point |
_rotl , _rotl64 , _rotr , _rotr64 |
Memutar bit dalam tipe bilangan bulat |
round , roundf , roundl |
Membulatkan nilai floating-point |
_scalb , _scalbf |
Menskalakan argumen dengan kekuatan 2 |
scalbn , scalbnf , scalbnl , scalbln , scalblnf , scalblnl |
Mengalikan angka titik mengambang dengan kekuatan integral FLT_RADIX |
_set_controlfp |
Mengatur kata kontrol titik mengambang |
_set_SSE2_enable |
Mengaktifkan atau menonaktifkan instruksi SSE2 |
signbit |
Menguji bit tanda dari nilai floating-point |
sin , sinf , sinl |
Menghitung sinus |
sinh , sinhf , sinhl |
Menghitung sinus hiperbolik |
sqrt , sqrtf , sqrtl |
Menghitung akar kuadrat |
_status87 , _statusfp , _statusfp2 |
Mendapatkan kata status floating-point |
strtof , _strtof_l |
Mengonversi string menjadi float |
strtold , _strtold_l |
Mengonversi string menjadi long double |
tan , tanf , tanl |
Menghitung tangen |
tanh , tanhf , tanhl |
Menghitung tangen hiperbolik |
tgamma , tgammaf , tgammal |
Menghitung fungsi gamma |
trunc , truncf , truncl |
Memotong bagian pecahan |
_wtof , _wtof_l |
Mengonversi string lebar menjadi double |
_y0 , _y1 , _yn |
Menghitung fungsi Bessel |
Baca juga
Rutinitas runtime Universal C menurut kategori
Primitif titik mengambang
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk