Problèmes liés à la précision JS

Shizawa. 2021-10-13 18:54:53
probl mes li la pr


La raison de cette note est,CuriositéJSPrécision,À partir des références3Regarde.,Pour être honnête, je ne vois pas très bien,Toutes sortes d'informations de recherche,Un par un pour vérifier et résoudre le puzzle.Je me suis souvenu de l'entier de sécurité,Tous ces problèmes sont dus à la précision,Donc, selon ma compréhension de la chaîne de connaissances...,À noter uniquement pour cette étude(C'est une goutte.,Envoyez - moi juste quelques regards),En cas d'erreur, Veuillez corriger(Au cas où quelqu'un le verrait...

1. Connaissance préalable

1.1 BAvecb

B = Byte = Octets = Unit é de stockage des données
b = Bit = Bits/Bits = Unités de transmission de données
1Octets = 8Bits
Copier le Code

Le stockage des données est"Octets"(Byte)En unités,La plupart des transferts de données se font par"Bits"(bit,Alias"Bits")En unités,Un chiffre représente un0Ou1(C'est - à - dire binaire),Chaque8Bits(bit,En brefb)Former un octet(Byte,En brefB),Est l'unit é d'information du plus petit niveau de double précision 8Octets 64Bits (1Octets = 8Bits) -- Baidu encyclopedia

1.2 La valeur représentée par le binaire

Par1Octets8Exemple de bits
Signé
Premier bit de symbole,0Représente un entier,1Indique un nombre négatif
Champ d'application:11111111 ~ 10000000 = 00000000 ~ 01111111 (Binaire)
-127 ~ -0 = +0 ~ 127(Décimal)
Sans symbole
Champ d'application:00000000 ~ 11111111(Binaire)
0 ~ 255(Décimal)
Copier le Code

Résumé:

n Plage de valeurs en bits :

Signé: [-2n-1 + 1, 2n-1 - 1]

Sans symbole: [0, 2n - 1]

// Une façon simple d'obtenir le meilleur 
n Nombre de chiffres
Signé[- Math.pow(2, n-1) + 1, + Math.pow(2, n-1) - 1]
Sans symbole[0, Math.pow(2, n) -1]
// Simple binaire à décimal disponible ici , La méthode de la partie entière 
// binaryStr Chaîne binaire légale ( Il n'y a que des contrôles légaux ici ), signBits de symbole
function binary2decimal(binaryStr, sign) {
let len = binaryStr.length;
if (!len) return binaryStr;
let flag = 1;
if (sign) {
flag = Math.pow(-1, +binaryStr[0]);
binaryStr = binaryStr.slice(1);
len -= 1;
}
const res = String(binaryStr).split('').reduce((pre, cur, inx) => pre + cur * Math.pow(2, len - inx - 1), 0);
return res * flag;
}
Copier le Code

1.3 IEEE 754Précision dans

Double précision = 8Octets = 64Bits, Par exemple:C++Moyennelong long、double,JSDansNumber...
Précision simple = 4Octets = 32Bits, Par exemple:C++Moyennelong int...
Copier le Code

IEEE 754 Forme de stockage flottante

image.png

Value = sign × exponent × fraction \displaystyle {\texttt {Value}}={\texttt {sign}}\times {\texttt {exponent}}\times {\texttt {fraction}}

C'est un nombre flottant Valeur réelle(value),égal àBits de symbole(sign bit)Multiplié par Valeur de décalage exponentielle (exponent bias)Multiplier parScore(fraction)

Précision simple

Précision simple- Oui.4Octets32Bits, Bit de symbole occupé 1,Position exponentielle8Bits,Les derniers chiffres23Bits,Total32Bits.

La formule de calcul correspondante pour la forme de stockage est : V = ( 1 ) S × ( 1. F ) × 2 E 127 V = (-1)^S \times (1.F) \times 2^{E-127}

S/sign: Symbole, 1Bits
E/exponent: Index, 8Bits, EChamp d'application(0, 255). Parce que c'est un entier non signé , Donc la portée est [0, 255], Notez l'Indice réel e=E-127.127C'est un décalage, La formule de calcul est:『2^e-2』!e Le champ d'application de [-127, 127], Mais...IEEE 754 Théorie normative "-127Et128 Utilisé comme traitement de valeur spécial ", Alors...e La plage réelle est [-126, 127],EOui.(0, 255).( Peut également être interprété comme un entier signé
F/fraction: Les derniers chiffres/Partie décimale, 23Bits, Fais - le.(1.F) C'est la notation scientifique ,1 Souvent omis
Copier le Code
Double précision

Double précision- Oui.8Octets64Bits, Bit de symbole occupé 1,Position exponentielle11Bits,Les derniers chiffres52Bits,Total64Bits.

La formule de calcul correspondante pour la forme de stockage est : V = ( 1 ) S × ( 1. F ) × 2 E 1023 V = (-1)^S \times (1.F) \times 2^{E-1023}

S/sign: Symbole, 1Bits
E/exponent: Index, 11Bits, ELa gamme de(0, 2047).Ibid.,e=E-1023,eChamp d'application[-1022, 1023].
F/fraction: Les derniers chiffres/Partie décimale, 52Bits
Copier le Code

2. JSPrécision dans

JavaScriptDeNumberLe type estDouble précisionIEEE 754 64 Bitfloat type

Alors...1Avec1.0 C'est exactement égal , Stocké à ( 1 ) 0 × ( 1.0 ) × 2 0 (-1)^0 \times (1.0) \times 2^0 ,Oui.S = 0, E - 1023 = 0, F = 0. La forme finale de stockage est la suivante

 0 01111111111 00000000000000000000000000000000000000000000000000000
S E F
Copier le Code

tip: Les derniers chiffres sont 52Bits, Mais les chiffres valides sont 53Bits. Parce qu'il ne reste qu'une fraction décimale ,- Oui.52Bits,Par défaut1≤Nombre effectif≤2, Donc la partie entière est fixée à 1,Pourcentage1Bits, N'oubliez pas de compter les parties entières lors de la conversion binaire en décimale ...

3. Conversion binaire et décimale entre

Méthode 1: Outils en ligne

Utilisation Outils Web pour la conversion décimale

Méthode 2: JSMéthode Native

Décimal à binaire
function decimal2binary(n) {
return Number(n).toString(2);
}
Copier le Code

image.png

Binaire à décimal (Partie entière)
function binary2decimal(binaryStr) {
return parseInt(binaryStr, 2);
}
Copier le Code

Méthode III: Algorithme de conversion décimale

(Montrer le chemin Références4 Bowen: JS Réaliser la conversion entre décimales et binaires

Binaire à décimal

La partie entière et la partie décimale sont combinées après conversion en décimales respectivement , Pour chacun, multipliez par 2De, La puissance est calculée en fonction de la distance par rapport à la première décimale , Droite à gauche , Négatif à droite .Par exemple10.101,Oui.10101 Dans un tableau , L'index décimal précédent est 1, 1 × 2 1 0 + 0 × 2 1 1 + 1 × 2 1 2 + 0 × 2 1 3 + 1 × 2 1 4 1 \times 2^{1-0} + 0 \times 2^{1-1} + 1 \times 2^{1-2} + 0 \times 2^{1-3} + 1 \times 2^{1-4}

// Voici une méthode simple pour convertir un nombre flottant binaire en décimal 
function binary2decimal(binaryStr) {
const point = binaryStr.indexOf('.');
if (point === 0) binaryStr = '0' + binaryStr;
const base = point === -1 ? binaryStr.length - 2 : point - 1;
return (binaryStr.substring(0, point) + binaryStr.substring(point + 1)).split('').reduce((pre, cur, index) => pre + cur * Math.pow(2, base - index), 0);
}
binary2decimal('1111011.111'); // 123.875
Copier le Code
Décimal à binaire
Partie entière

Méthodes:Sauf2Prends le reste,Ordre inverse

Partie décimale

Méthodes:Multiplier par2Arrondi,Ordre

Par0.1Par exemple

0.1 * 2 = 0.2 >>> 0
0.2 * 2 = 0.4 >>> 0 //
0.4 * 2 = 0.8 >>> 0
0.8 * 2 = 1.6 >>> 1
0.6 * 2 = 1.2 >>> 1
0.2 * 2 = 0.4 >>> 0 // Commencez à répéter
Alors...0011 C'est un noeud circulaire
Copier le Code

(Décimal)0.1 =(Binaire) 0.0(0011)Cycle

4. Pourquoi perdre la précision

Enfin, le texte .../doge

(Montrer le chemin Références3 Bowen: Détails nécessaires à l'entrevue JS Précision numérique

0.1 =0.0(0011)Cycle ≈ 0.0 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 001 (52 Perte après bit ) = 0.09999999999999987 ≠ 0.1

Donc la conclusion est: La raison essentielle est que lorsque la décimale est convertie en binaire , Il y a eu une boucle infinie , Il ne reste que 52 Bits et précision manquante

5. Entier de sécurité

(Montrer le chemin Références7 JavaScript Piège à points flottants et sa solution

Un entier peut correspondre à un point flottant un par un

  1. 2 53 1 2^{53} - 1
  2. Number.MAX_SAFE_INTEGER

Saupoudrer de fleurs à la fin*,°:.*( ̄▽ ̄)/$:.°* .

( Première écriture , Peut - être qu'il n'y a que lui qui peut comprendre ... C'est tout d'abord comme ça, puis on s'enrichira

todolist:
1. toStringComment ça marche
2. Number Méthodes de précision toFixed、toPrecisionAttendez.
3. js Une solution relativement sûre pour le calcul numérique moyen
Copier le Code

Références

  1. Wiki: IEEE 754 Forme de stockage flottante
  2. Bowen( Facile à comprendre ,Par1Sous réserve): IEEE754Format standard
  3. Bowen: Détails nécessaires à l'entrevue JS Précision numérique
  4. Bowen: JS Réaliser la conversion entre décimales et binaires
  5. Oui.: Conversion entre binaires et décimaux
  6. Bowen: Nombre flottant binaire à décimal
  7. issue: JavaScript Piège à points flottants et sa solution
  8. Oui.: Entier de sécurité
版权声明
本文为[Shizawa.]所创,转载请带上原文链接,感谢
https://qdmana.com/2021/10/20211013185442267S.html

  1. 前端开发框架Vue中Vuex的使用原理分享
  2. vue-echarts初次体验
  3. 分享一些web前端开发好用的网站
  4. 每天读一点webpack-003
  5. react之组件生命周期
  6. Alibaba collection version of mybatis handwritten documents, Java front-end interview questions
  7. SpringBoot Java后端实现okhttp3超时设置
  8. react之組件生命周期
  9. Cycle de vie des composants de React
  10. 使用Reactor将阻塞调用变为异步非阻塞
  11. Baked cake wife sun photos, plain face on camera, beautiful appearance is still a beauty, watching children during the festival is a little helpless
  12. 亚洲知名插画师荒川(arakawa) 仅8件独版NFT作品系列《Can't Out》正式上架Element综合市场
  13. Taiyuan: singing, welcoming the national day, gathering to praise blessings
  14. Arakawa, un illustrateur Asiatique bien connu, n'a mis sur le marché que huit pièces de la collection NFT "can't out" en une seule édition.
  15. Résumé des questions d'entrevue Hadoop (II) - - hdfs
  16. 如何解决“Serverless”系统的冷启动问题
  17. BootstrapBlazor 模板安装
  18. BootstrapBlazor 模板安装
  19. Tong Liya Jin Chen bumps her hair, Xie Na Zhao Liying bumps her shirt, and she sees EQ from the reaction
  20. 使用ESLint+Prettier来统一前端代码风格
  21. 为什么说 Node.js 是实时应用程序开发的绝佳选择
  22. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  23. 使用elementui在完成项目中遇到的未知知识点2
  24. On the mechanism of webpack loader
  25. 云原生体系下 Serverless 弹性探索与实践
  26. vue开发技巧
  27. Une fleur merveilleuse de l'histoire de l'industrie des nouveaux véhicules énergétiques, Zhongtai Jiangnan T11, une voiture vintage que vous n'avez jamais vue
  28. 致敬!再见了!LayUI !
  29. Vue安装和卸载
  30. Implement a flipped character with the transform attribute of CSS
  31. 你的第一个 Docker + React + Express 全栈应用
  32. [apprentissage de l'algorithme] 1486. Fonctionnement exclusif du tableau (Java / C / C + + / python / go / Rust)
  33. Zhang Daxian sends a blessing video on xYG relay, showing positive energy in details
  34. 前端技巧-JS元编程ES6 symbol公开符号
  35. Article de 37 ans seul à l'hôpital!Il boitait, soupçonnait d'être blessé, souriait avec douleur
  36. 前端推荐!10分钟带你了解Konva运行原理
  37. npm ERR! iview-project@3.0.0 init: `webpack --progress --config webpack.dev.config.js
  38. 零基础学习Web前端需要注意什么呢?
  39. The Youth League promotes Yiyang Qianxi new film, and the relationship between the two generation and the generation is good. Li Fei is blessed.
  40. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  41. JavaScript数组 几个常用方法
  42. Qu'est - ce qu'il faut remarquer à l'avant - plan Web de l'apprentissage de base zéro?
  43. 暢談this的四種綁定方式
  44. 2021最新Vue面试必胜宝典,大厂面试题解析!
  45. Quatre façons de lier ceci
  46. Préparation au développement de l'extension tagdown
  47. Intervieweur: Parlez - moi des flotteurs CSS
  48. Packaging the View Component Library with rollup
  49. Comment un composant enfant modifie les valeurs passées par le composant parent
  50. Résumé de l'API Express
  51. Optimisation de la structure du Code if else dans le projet
  52. Fonction magique pour résoudre le problème de la fonction maybe - - fonction either
  53. 新手学前端的方法是什么 自学前端该怎么规划
  54. 云原生体系下 Serverless 弹性探索与实践
  55. 如何全方位打造安全高效的HTTPS站点(一)
  56. "Liu Jing dit che 丨 point de vue" est - ce que Custom Road est un MpV digne de la terre?
  57. 从理念到LRU算法实现,起底未来React异步开发方式
  58. Compared with Volvo XC60, Lingke 09 goes out of the spa platform. What would you choose, regardless of the brand?
  59. PaddlePaddle:在 Serverless 架构上十几行代码实现 OCR 能力
  60. 云原生体系下 Serverless 弹性探索与实践