Saya menguji apa yang dikembalikan dari divisi termasuk nol yaitu 0/1
, 1/0
dan 0/0
. Untuk ini saya menggunakan sesuatu yang mirip dengan yang berikut:
Console.WriteLine(1d / 0d);
Namun kode ini 8
tidak mencetak Infinity
atau string konstan lainnya suka PositiveInfinity
.
Untuk melengkapi semua cetakan berikut 8
:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Dan Console.WriteLine(Double.NegativeInfinity);
cetakan -8
.
Mengapa infinity ini mencetak 8?
Bagi Anda yang tampaknya berpikir ini adalah simbol infinity bukan delapan program berikut:
Console.WriteLine(1d / 0d);
double value = 1d / 0d;
Console.WriteLine(value);
Console.WriteLine(Double.PositiveInfinity);
Console.WriteLine(8);
Output:
∞
adalah tanda ketidakterbatasan. balik saja 90 derajat untuk melihatnya 88
karakter Unicode yang sebenarnya , bukan yang aneh untuk infinity, diputar 90 derajat? Ini bisa berubah berdasarkan lokasi Anda. Saya mencobanya di dotnetfiddle.net dan hasilnya tercetakInfinity
.Double.PositiveInfinity.ToString()[0] == '8'
. Ada beberapa karakter eksotis yang terlihat sangat mirip dengan yang lain di beberapa font. Selain itu, bahasa apa yang dikonfigurasikan komputer Anda?8
(bahasa Jerman).Console.Write("∞");
Jawaban:
Yakinlah bahwa nilai floating point adalah
+Infinity
jika pembilang dari divisi floating point dengan nol adalah positif,-Infinity
jika pembilang dari pembagian floating point dengan nol adalah negatif, danNaN
jika pembilang dan penyebut dari divisi floating point keduanya nol. Itu dalam spesifikasi floating point IEEE754 , yang digunakan oleh C #.Dalam kasus Anda, the konsol sedang mengubah simbol infinity (yang kadang-kadang digambarkan secara tipografis sebagai horizontal 8 - ∞) menjadi vertikal 8.
sumber
Infinity
atau serupa bahkan jika saya menggunakan kode dari jawaban oleh Soren dengan menentukan budayaDiberikan pengaturan tertentu (yaitu kombinasi budaya, pengkodean keluaran, dll.). NET akan menampilkan karakter infode Unicode ∞ (∞ / & # 8734;). Emulator konsol / terminal Windows 10 akan (sekali lagi diberikan pengaturan tertentu - lihat tangkapan layar di bawah) menampilkan karakter Unicode ini sebagai 8.
Sebagai contoh, pada Windows 10, dengan pengaturan di bawah ini (perhatikan halaman kode) hanya menempelkan ∞ ke dalam konsol yang menunjukkan 8.
EDIT
Dengan terima kasih atas komentar dari Chris : Tampaknya font output dalam kombinasi dengan halaman kode bertanggung jawab atas masalah ∞ => 8 pada konsol. Seperti dia, saya mendapatkan tampilan yang benar dari ∞ di semua font TrueType yang telah saya coba dan hanya melihat 8 ketika font raster dipilih.
sumber
The
8
simbol terjadi ketika Windows mengkonversi Unicode ke pengkodean karakter warisan. Karena tidak ada simbol tak terhingga dalam penyandian sebelumnya, secara default ia menggunakan "paling cocok" untuk simbol itu , yang dalam hal ini adalah angka 8. Lihat contoh untuk pengkodean "windows-1252" Microsoft . Rupanya, Windows 10 masih menggunakan penyandian karakter lama secara default di konsol (lihat "Halaman Kode" ).sumber
Catatan:
.ToString()
Metode panggilan implisit saat menulisDouble.PositiveInfinity
ke konsol bertanggung jawab atas perilaku ini.Panggilan
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("en-Us")));
menghasilkan string "Infinity"
sementara
Console.WriteLine(Double.PositiveInfinity.ToString(new CultureInfo("fr-Fr")));
menghasilkan "+ Infini".Sunting: Seperti yang orang lain tunjukkan di commets, mereka tidak dapat sepenuhnya mengkonfirmasi hasil saya. Menguji ini pada mesin yang berbeda, saya mendapatkan karakter
∞
untuk kedua panggilan.Keluaran untuk semua budaya , terima kasih kepada vtortola di komentar.
Saya menemukan jawaban (kemungkinan):
Menggunakan
Console.OutputEncoding = Encoding.Unicode;
I dapat menciptakan kembali perilaku yang Anda alami untuk beberapa budaya, misalnya "ru", "ru-RU" menghasilkan output8
.sumber
Infinity
di keduanya. Budaya mana yang dijalankan aplikasi Anda? PeriksaThread.CurrentThread.CurrentCulture
danThread.CurrentThread.CurrentUICulture
.8
dotnetfiddle.net/QYhXMu.ToString()
. Pada akhirnya,ToString()
akan mengembalikan.PositiveInfinitySymbol
yang relevanNumberFormatInfo
. Ini tampaknya tergantung pada versi runtime dan / atau versi Windows (atau OS apa pun). Di masa lalu,CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
akan sama dengan"Infinity"
, tetapi dengan versi yang lebih baru dari runtime dan sistem operasi"∞"
. Saya hanya bertanya tentang hal itu dalam komentar atas jawaban Hans Passant di utas ini.Kode repro:
Halaman kode 1252 adalah kecelakaan yang cukup umum di Inggris karena ini adalah halaman kode Windows default di sana. Seperti untuk Eropa Barat dan Amerika. Banyak alasan untuk mengubah properti Console.OutputEncoding default secara terprogram, banyak file teks akan dikodekan pada 1252. Atau dari baris perintah dengan mengetik
chcp 1252
(chcp == halaman kode ganti) sebelum memulai program.Seperti yang dapat Anda ketahui dari rangkaian karakter yang didukung oleh 1252, simbol Infinity tidak tersedia. Jadi Pengkodean harus datang dengan pengganti. Itu sering merupakan
?
mesin terbang untuk titik kode Unicode yang tidak didukung, nilai properti Encoding.EncoderFallback untuk penyandian 8-bit. Tetapi untuk 1252, dan warisan MS-Dos 850 dan 858 halaman kode, programmer Microsoft memutuskan untuk melakukannya8
. Orang yang lucu.Mesin terbang itu adalah didukung dalam halaman kode biasa untuk konsol aplikasi pada mesin Barat. Yaitu 437, cocok dengan rangkaian karakter IBM sebelumnya . Memiliki jenis bencana pengkodean inilah sebabnya Unicode ditemukan. Sayangnya terlambat untuk menyelamatkan aplikasi konsol, terlalu banyak kode di sekitar yang bergantung pada halaman kode MS-Dos default.
Memiliki Double.PositiveInfinity dikonversi ke "∞" khusus untuk Win10. Dulu "Infinity" di versi Windows sebelumnya. Format semacam ini biasanya dapat dimodifikasi dengan Control Panel> Bahasa> Ubah format tanggal, waktu, atau angka> tombol Pengaturan Tambahan tetapi pemilihan simbol infinity tidak termasuk dalam dialog. Juga tidak tercakup oleh registri (HKCU \ Control Panel \ International), lebih merupakan pengawasan besar. Ini adalah LOCALE_SPOSINFINITY di winapi asli. Dalam program .NET Anda dapat menimpanya secara terprogram dengan mengkloning CultureInfo dan mengubah properti NumberFormatInfo.PositiveInfinitySymbol. Seperti ini:
sumber
ý
sebagai ganti∞
. Ini juga menunjukkan kepada saya bahwa menggunakan font non-raster menghindari masalah.CultureInfo.GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
memberi"Infinity"
atau"∞"
(atau sesuatu yang lain)? Anda mengatakan di atas bahwa ini khusus untuk Windows 10, dan saya setuju itu diubah pada suatu waktu. Tetapi jika saya menjalankan aplikasi pada Windows 8 dengan versi .NET Framework yang sama , akankah saya mendapatkan hasil yang berbeda dibandingkan dengan Windows 10?$PSVersionTable
mengungkapkan versi PS adalah sesuatu dengan 5.1. PowerShell itu menargetkan .NET Framework (CLR) versi 4. * yang saya tahu baru di mesin itu. Masih[cultureinfo]::GetCultureInfo("en-US").NumberFormat.PositiveInfinitySymbol
dari Windows PowerShell memberiInfinity
, bukan∞
(budaya saat inien-US
). Kesimpulan: Versi Windows memutuskan, bukan versi .NET."8" untuk infinity ditampilkan di konsol saat menjalankan .Net 4 dan di atasnya, jika tidak, versi sebelumnya menampilkan "Infinity".
Menggunakan Console.OutputEncoding = Encoding.Unicode; di .Net 4 dan di atasnya akan mendapatkan infinity untuk ditampilkan sebagai ∞, tetapi melempar IOException di versi sebelumnya.
CATATAN: Saya menjalankan Visual Studio 2015 Community Edition pada Windows 10 64-bit
sumber