JS motorlarının bir NaN'nin bitlerini değiştirmesine izin verilir mi?


12

JavaScript'te, NaN değeri dahili olarak çok çeşitli 64-bit çiftler ile temsil edilebilir. Özellikle, aşağıdaki bitsel gösterime sahip herhangi bir çift:

x111 1111 1111 xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx xxxx

NaN olarak yorumlanır. Sorum şu: ArrayBuffers kullanarak bir JS Numarasına iki 32-bit uints attığımı varsayalım, onu geçip iki 32-bit uints'e geri döndürdüğümü varsayalım. Kurtarılan bitler orijinal ile aynı mı olacak yoksa JS motorlarının bir NaN'nin bitlerini istediği gibi değiştirmesine izin verilecek mi? Başka bir deyişle, JS numaraları 64 biti kayıp bir şekilde saklamak için kullanılabilir mi?


2
İlginç fikir
Evert

1
Bir test yaptım. En azından Node.js, istekleri değiştirerek bilgi kaybına neden oluyor gibi görünüyor.
MaiaVictor

1
Kenara: Bu tür her bit modeli bir NaN'yi temsil etmez. Birinciden sonraki tüm x işaretleri sıfırsa, bir sonsuzluğu temsil eder.
Eric Postpischil

Yanıtlar:


6

ECMA-262 9 inci Baskı, Haziran 2018, (standart hangi JavaScript amaçlanmaktadır uyması) 6.1.6 “Numara Tipi”, der ki:

… IEEE Standardının 9007199254740990 (yani 2 53 -2) farklı “Sayı Değil” değerleri ECMAScript'te tek bir özel NaN değeri olarak temsil edilir.… Bazı uygulamalarda, harici kod bir fark algılayabilir çeşitli Sayı Değil değerleri arasında, ancak bu tür davranışlar uygulamaya bağlıdır; ECMAScript koduna göre, tüm NaN değerleri birbirinden ayırt edilemez.

24.1.17 “NumberToRawBytes (tür, değer, isLittleEndian)” diyor:

… Değer NaN ise, rawBytes seçilen IEEE 754-2008 binary64 biçiminde Sayı Değil kodlamasına göre ayarlanabilir. Bir uygulama, her bir uygulama ayırt edilebilir NaN değeri için her zaman aynı kodlamayı seçmelidir.

Bu soruyu aydınlatan NaN'den bahseden başka pasajlar görmüyorum. Bir yandan, 24.1.17, NaN'yi ham bayta dönüştürürken bir NaN'nin bitlerinin korunması gerektiğini bize etkili bir şekilde söyler. Ancak, bitlerin diğer işlemlerde korunması gerektiğini söyleyen başka bir şey görünmüyor. Bunun niyet olduğu anlaşılabilir, çünkü 24.1.17'deki bu gereklilik, bitlerin herhangi bir başka işlemle keyfi olarak değiştirilebilmesi durumunda bir amaca hizmet etmeyecektir. Ancak bunu bu amaca uygun olarak uygulamak için JavaScript uygulamalarına güvenmem.


1

Bir keresinde Java için NaN değerlerinin donanıma bağlılığı hakkında bir soru sordum ve bir NaN değeri yüklendiğinde bazı CPU'ların sessizce bir "NaN sinyalini" sessiz NaN'ye (sessiz NaN bitini ayarlayarak) dönüştüreceği fark edildi. bir işlemci kaydına. Yani bitlerden en az biri, sessiz NaN biti, keyfi verileri depolamak için kullanamazsınız.

Sessiz NaN biti ayarlandığı sürece diğer bitleri kullanmak muhtemelen güvenlidir. Ama yine de burada uygulamaya bağımlılık için yer var gibi görünüyor ve bu nedenle hiçbir garanti yok.

Bu tür bir sorun, normal dil işlemlerinin bir NaN'nin iç değerine bağlı olan herhangi bir şey yapmaktan kaçınmasının ve tüm NaN'lere "sadece NaN" olarak davranmayı tercih etmesinin nedenidir.


0

Orijinal IEEE-754 standardı, bir NaN'nin uçlarını kasıtlı olarak uygulamaya bıraktı. Gibi ipuçları verdi

NaN'nin oluşturulduğu yerin orijinal bellek adresini koyabilirsiniz.

Bu arada, aritmetiğin bir NaN ile ne yapılacağı hakkında belirli kuralları vardır ve bunun alt kısımdaki bitlerle ilgisi yoktur. İki NaN eklerken ne yapacağını bile söylediğini sanmıyorum - bunlardan birinin bitlerini başka bir bit setini oluşturmaya karşı tutun. Sadece sonuç hala bir NaN olmalı.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.