Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Terkadang saat meningkatkan proyek ke versi Visual Studio yang lebih baru, Anda mungkin melihat perubahan dalam hasil operasi floating-point tertentu. Ini umumnya terjadi karena salah satu dari dua alasan: Perubahan pembuatan kode yang memanfaatkan prosesor yang tersedia dengan lebih baik, dan perbaikan bug atau perubahan pada algoritma yang digunakan dalam fungsi matematika di pustaka runtime C (CRT). Secara umum, hasil baru sudah benar dalam batas yang ditentukan oleh standar bahasa. Baca terus untuk mengetahui apa yang berubah, dan jika penting, cara mendapatkan hasil yang sama yang didapatkan fungsi Anda sebelumnya.
Fungsi matematika baru dan perubahan Universal CRT
Sebagian besar fungsi matematika CRT telah tersedia di Visual Studio selama bertahun-tahun, tetapi mulai dari Visual Studio 2013, semua fungsi yang diperlukan oleh ISO C99 disertakan. Fungsi-fungsi ini diimplementasikan untuk menyeimbangkan performa dengan kebenaran. Karena menghasilkan hasil yang dibulatkan dengan benar dalam setiap kasus 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 unit ketelitian terkecil, atau ulp, dari hasil yang dibulatkan dengan benar. Namun, mungkin ada kasus tertentu di mana ketidakakuratan lebih besar terjadi. Jika Anda menggunakan pustaka matematika yang berbeda untuk mendapatkan fungsi-fungsi ini sebelumnya, perbedaan implementasi mungkin menjelaskan perubahan hasil Anda.
Ketika fungsi matematika dipindahkan ke Universal CRT di Visual Studio 2015, beberapa algoritma baru digunakan, dan beberapa bug dalam implementasi fungsi yang baru di Visual Studio 2013 diperbaiki. Perubahan ini dapat menyebabkan perbedaan yang dapat dideteksi dalam hasil perhitungan floating-point yang menggunakan fungsi-fungsi ini. Fungsi yang memiliki bug adalah erf, exp2, remainder, remquo, scalbln, dan scalbn, serta varian float dan long double mereka. Perubahan lain dalam Visual Studio 2015 memperbaiki masalah dalam mempertahankan kata status floating point dan informasi status pengecualian dalam fungsi _clear87, _clearfp, fegetenv, fesetenv, dan feholdexcept.
Perbedaan prosesor dan bendera kompilator
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. Anda mungkin melihat ini saat memigrasikan kode lama, karena opsi arsitektur kompilator x86 default berubah menjadi /arch:SSE2 di Visual Studio 2012. 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 pada platform yang berbeda. Dalam kebanyakan kasus, hasilnya berada dalam +/-1 ulp dari hasil yang dibulatkan dengan benar, tetapi hasil aktual dapat bervariasi di seluruh CPU.
Peningkatan pembuatan kode dalam berbagai mode floating-point juga dapat mengubah hasil floating-point saat membandingkan kode lama dengan kode baru, bahkan dengan bendera kompilator yang identik. Misalnya, kode yang dihasilkan oleh Visual Studio 2010 ketika /fp:precise (default) atau /fp:strict ditentukan mungkin tidak menyebarluaskan nilai bukan angka perantara (NaN) melalui ekspresi dengan benar. Dengan demikian, beberapa ekspresi yang memberikan hasil numerik pada pengkompilasi yang lebih lama sekarang dapat menghasilkan hasil NaN dengan benar. Anda mungkin juga melihat perbedaan karena pengoptimalan kode yang diaktifkan untuk /fp:fast saat ini memanfaatkan lebih banyak fitur prosesor. Pengoptimalan ini dapat menggunakan lebih sedikit instruksi, tetapi dapat memengaruhi hasil yang dihasilkan karena beberapa operasi perantara yang terlihat sebelumnya telah dihapus.
Cara mendapatkan hasil yang identik
Dalam kebanyakan kasus, floating-point berubah di kompilator dan pustaka terbaru menghasilkan perilaku yang lebih cepat atau lebih benar, atau keduanya. Anda bahkan mungkin melihat performa daya prosesor yang lebih baik ketika instruksi SSE2 menggantikan instruksi x87. Namun, jika Anda memiliki kode yang harus mereplikasi dengan tepat perilaku floating point kompilator yang lebih lama, pertimbangkan untuk menggunakan kemampuan multi-penargetan Visual Studio yang asli, dan membangun proyek yang terpengaruh menggunakan alat build yang lama. Untuk informasi selengkapnya, lihat Menggunakan multi-penargetan asli di Visual Studio untuk membangun proyek lama.
Lihat juga
Meningkatkan proyek dari versi Visual C++ yang lebih lama
Gambaran umum potensi masalah peningkatan (Visual C++)
Riwayat perubahan Visual C++ 2003 - 2015