Nhận thứ tự cường độ javascript

Thuộc tính

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6 đại diện cho sự khác biệt giữa 1 và số dấu phẩy động nhỏ nhất lớn hơn 1

Show

Thử nó

Thuộc tính thuộc tính của

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6WritablenoEnumerablenoConfigurableno

Sự mô tả

Tài sản

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
8 có giá trị xấp xỉ
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
9, hoặc 2-52. Đây là giá trị nhỏ nhất có thể được thêm vào 1 để có được một số riêng biệt, vì định dạng dấu phẩy động chính xác kép chỉ có 52 bit để biểu thị phần định trị và bit thấp nhất có ý nghĩa từ 2-52

Lưu ý rằng độ chính xác tuyệt đối của các số thực giảm khi số đó lớn hơn, vì số mũ tăng lên trong khi độ chính xác của phần định trị không đổi.

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
0 là số dương nhỏ nhất có thể biểu diễn, nhỏ hơn nhiều so với
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6

Bởi vì

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
8 là thuộc tính tĩnh của
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
1, nên bạn luôn sử dụng nó dưới dạng
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6, thay vì thuộc tính có giá trị số

ví dụ

Kiểm tra bình đẳng

Bất kỳ hệ thống mã hóa số nào chiếm một số bit hữu hạn, thuộc bất kỳ cơ sở nào bạn chọn (e. g. thập phân hoặc nhị phân), nhất thiết sẽ không thể biểu diễn chính xác tất cả các số, bởi vì bạn đang cố biểu diễn vô số điểm trên trục số bằng cách sử dụng một lượng bộ nhớ hữu hạn. Ví dụ: hệ cơ số 10 (thập phân) không thể biểu thị chính xác 1/3 và hệ cơ số 2 (nhị phân) không thể biểu thị chính xác

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
3. Do đó, ví dụ,
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
4 không chính xác bằng
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
5

console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false

Vì lý do này, người ta thường khuyên rằng không bao giờ nên so sánh các số dấu phẩy động với

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6. Thay vào đó, chúng ta có thể coi hai số là bằng nhau nếu chúng đủ gần nhau. Hằng số
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6 thường là một ngưỡng sai số hợp lý nếu phép tính số học ở khoảng độ lớn của
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
8, vì về bản chất,
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
8 xác định mức độ chính xác của số "1"

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true

Tuy nhiên,

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6 không phù hợp với bất kỳ hoạt động số học nào ở cường độ lớn hơn. Nếu dữ liệu của bạn ở cấp độ lớn 103, phần thập phân sẽ có độ chính xác nhỏ hơn nhiều so với
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6

________số 8

Trong trường hợp này, cần có dung sai lớn hơn. Vì các số được so sánh có độ lớn xấp xỉ ________ 82, nên một hệ số nhân chẳng hạn như ________ 83 sẽ tạo ra đủ dung sai cho trường hợp này

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
1

Ngoài độ lớn, điều quan trọng là phải xem xét tính chính xác của đầu vào của bạn. Ví dụ: nếu các số được thu thập từ đầu vào biểu mẫu và giá trị đầu vào chỉ có thể được điều chỉnh theo các bước của

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
3 (i. e.
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002; error of 10^-13 instead of 10^-16
console.log(equal(x + y, z)); // false
5), thường nên cho phép dung sai lớn hơn nhiều, chẳng hạn như
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 1000.1;
const y = 1000.2;
const z = 2000.3;
console.log(x + y); // 2000.3000000000002; error of 10^-13 instead of 10^-16
console.log(equal(x + y, z)); // false
6, vì dữ liệu chỉ có độ chính xác là
function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
3

Ghi chú. bài học quan trọng. không chỉ đơn giản sử dụng

function equal(x, y) {
  return Math.abs(x - y) < Number.EPSILON;
}

const x = 0.2;
const y = 0.3;
const z = 0.1;
console.log(equal(x + z, y)); // true
6 như một ngưỡng để kiểm tra bình đẳng. Sử dụng ngưỡng phù hợp với độ lớn và độ chính xác của các số bạn đang so sánh