The Secret Life of NaN (2018)
La norme IEEE 754-2008 définit des NaN avec des bits de charge utile pouvant transporter de l'information, par exemple 51 bits de payload dans les nombres à virgule double précision. La norme distingue les NaN dits « quiet » et « signaling », recommande de préserver autant que possible le payload pour des informations diagnostiques, et les sNaN peuvent déclencher des exceptions lors d'opérations. Des implémentations de langages dynamiques utilisent le NaN-boxing pour encoder tous les autres types et leurs tags dans l'espace des payloads de NaN, de sorte que toutes les valeurs tiennent sur 64 bits tout en laissant les doubles valides inchangés. JavaScriptCore (ainsi que SpiderMonkey et LuaJIT) met en œuvre cette technique en réservant des plages de bits pour pointeurs et immédiats, en décalant les doubles via un offset 2^48 pour éviter les collisions et en assignant des valeurs spéciales pour null, true, false et autres. Le NaN-boxing offre des gains de mémoire et de performance mais complique l'implémentation, nécessite des opérations de boxage/déboxage et a déjà été à l'origine de vulnérabilités liées à des erreurs de validation.