Bagikan melalui


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 floating-point 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.

Versi UCRT yang lebih baru dapat meningkatkan presisi dan akurasi fungsi pustaka matematika floating-point. Karena UCRT adalah bagian dari sistem operasi Windows, Anda mungkin mendapatkan hasil yang berbeda untuk fungsi-fungsi ini pada versi sistem operasi yang berbeda atau antara build debug dan rilis. Meskipun tidak disarankan, Anda dapat secara statis menautkan ke UCRT untuk menjamin hasil yang konsisten jika Anda membutuhkan fungsi-fungsi ini akan menghasilkan hasil yang identik di mana-mana.

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 Menggunakan
abs, , labsllabs,_abs64 Menghitung nilai absolut dari jenis bilangan bulat
acos, , acosfacosl Menghitung kosinus busur
acosh, , acoshfacoshl Menghitung kosinus busur hiperbolik
asin, , asinfasinl Menghitung sinus busur
asinh, , asinhfasinhl Menghitung sinus busur hiperbolik
atan, , atanfatanl, atan2, , atan2f,atan2l Menghitung tangen busur
atanh, , atanhfatanhl 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, , cbrtfcbrtl Menghitung akar kubus
ceil, , ceilfceill 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, , copysignfcopysignl, _copysign, , _copysignf,_copysignl Mengembalikan nilai yang memiliki besaran satu argumen dan tanda yang lain
cos, , cosfcosl Menghitung sinus
cosh, , coshfcoshl Menghitung sinus hiperbolik
div, , ldivlldiv Menghitung kuota dan sisa dua nilai bilangan bulat
_ecvt, ecvt Mengonversi menjadi double string
_ecvt_s Versi aman dari _ecvt
erf, , erfferfl Menghitung fungsi kesalahan
erfc, , erfcferfcl Menghitung fungsi kesalahan pelengkap
exp, , expfexpl Menghitung eksponensial ex
exp2, , exp2fexp2l Menghitung eksponensial 2x
expm1, , expm1fexpm1l Menghitung ex-1
fabs, , fabsffabsl Menghitung nilai absolut dari jenis floating-point
_fcvt, fcvt Mengonversi angka floating-point menjadi string
_fcvt_s Versi aman dari _fcvt
fdim, , fdimffdiml 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, , floorffloorl Menghitung lantai
fma, , fmaffmal Menghitung multiply-add yang menyatu
fmax, , fmaxffmaxl Menghitung maksimum argumen
fmin, , fminffminl Menghitung minimum argumen
fmod, , fmodffmodl 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, , frexpffrexpl 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, , hypotfhypotl, _hypot, , _hypotf,_hypotl Menghitung hipotenus
ilogb, , ilogbfilogbl 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, , isgreaterequalisless, islessequal, , islessgreater,isunordered Membandingkan urutan dua nilai floating-point
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, , ldexpfldexpl Komputasi x*2n
lgamma, , lgammaflgammal Menghitung logaritma alami dari nilai absolut fungsi gamma
llrint, , llrintfllrintl Membulatkan nilai floating-point ke nilai terdekat long long
llround, , llroundfllroundl Membulatkan nilai floating-point ke nilai terdekat long long
log, , logflogl, log10, , log10f,log10l Menghitung logaritma alami atau base-10
log1p, , log1pflog1pl Menghitung logaritma alami 1+x
log2, , log2flog2l Menghitung logaritma base-2
logb, , logbflogbl, , _logb,_logbf Mengembalikan eksponen dari nilai floating-point
lrint, , lrintflrintl Membulatkan nilai floating-point ke nilai terdekat long
_lrotl, _lrotr Memutar nilai bilangan bulat ke kiri atau kanan
lround, , lroundflroundl 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, , modffmodfl Membagi nilai floating-point menjadi bagian pecahan dan bilangan bulat
nan, , nanfnanl Mengembalikan nilai NaN yang diam
nearbyint, , nearbyintfnearbyintl Mengembalikan nilai yang dibulatkan
nextafter, , nextafterfnextafterl, , _nextafter,_nextafterf Mengembalikan nilai floating-point berikutnya yang dapat diwakili
nexttoward, , nexttowardfnexttowardl Mengembalikan nilai floating-point berikutnya yang dapat diwakili
pow, , powfpowl Mengembalikan nilai dari xy
remainder, , remainderfremainderl Menghitung sisa kuota dari dua nilai floating-point
remquo, , remquofremquol Menghitung sisa dua nilai bilangan bulat
rint, , rintfrintl Membulatkan nilai floating-point
_rotl, , _rotl64_rotr,_rotr64 Memutar bit dalam tipe bilangan bulat
round, , roundfroundl Membulatkan nilai floating-point
_scalb, _scalbf Menskalakan argumen dengan kekuatan 2
scalbn, , scalbnfscalbnl, 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, , sinfsinl Menghitung sinus
sinh, , sinhfsinhl Menghitung sinus hiperbolik
sqrt, , sqrtfsqrtl 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, , tanftanl Menghitung tangen
tanh, , tanhftanhl Menghitung tangen hiperbolik
tgamma, , tgammaftgammal Menghitung fungsi gamma
trunc, , truncftruncl Memotong bagian pecahan
_wtof, _wtof_l Mengonversi string lebar menjadi double
_y0, , _y1_yn Menghitung fungsi Bessel

Lihat juga

Rutinitas runtime Universal C menurut kategori
Primitif titik mengambang