Tại sao Double.MIN_VALUE không âm


157

Bất cứ ai cũng có thể làm sáng tỏ lý do tại sao Double.MIN_VALUEthực sự không phải là giá trị tối thiểu mà Nhân đôi có thể mất? Đó là một giá trị tích cực, và một đôi tất nhiên có thể là âm.

Tôi hiểu tại sao nó là một con số hữu ích, nhưng nó có vẻ là một cái tên rất không trực quan, đặc biệt là khi so sánh với Integer.MIN_VALUE. Gọi nó Double.SMALLEST_POSITIVEhoặc MIN_INCREMENTtương tự sẽ có ngữ nghĩa rõ ràng hơn.

Ngoài ra, giá trị tối thiểu mà Nhân đôi có thể mất là bao nhiêu? Phải -Double.MAX_VALUEkhông Các tài liệu dường như không nói.


1
Cảm ơn các câu trả lời! Sự khác biệt giữa phạm vi và độ chính xác có ý nghĩa. Tôi vẫn thấy việc đặt tên khá lạ và không nhất quán, nhưng nó hoàn toàn khả thi.
mo-seph

1
Tôi đoán bởi vì nó được viết bởi cùng một thiên tài, người đã gọi một phương pháp writeBytescần một String.
Trejkaz

Về cơ bản, bạn nói đúng, đó là ngữ nghĩa tồi
Alvaro

Câu trả lời:


180

Định dạng IEEE 754 có một bit dành riêng cho dấu hiệu và các bit còn lại biểu thị cường độ. Điều này có nghĩa là nó "đối xứng" xung quanh origo (trái ngược với các giá trị Integer, có thêm một giá trị âm). Do đó, giá trị nhỏ nhất chỉ đơn giản là giống như giá trị lớn nhất, với dấu-bit thay đổi, vì vậy , -Double.MAX_VALUElà con số thực tế có thể nhỏ nhất mà bạn có thể biểu diễn với một double.

Tôi cho rằng Double.MAX_VALUEnên được xem là cường độ tối đa , trong trường hợp đó thực sự có ý nghĩa để viết đơn giản -Double.MAX_VALUE. Nó cũng giải thích tại sao Double.MIN_VALUEgiá trị dương ít nhất (vì nó đại diện cho cường độ nhỏ nhất có thể).

Nhưng chắc chắn, tôi đồng ý rằng việc đặt tên là một chút sai lệch. Đã quen với ý nghĩa Integer.MIN_VALUE, tôi cũng hơi ngạc nhiên khi đọc đó Double.MIN_VALUElà giá trị tuyệt đối nhỏ nhất có thể được biểu diễn. Có lẽ họ nghĩ rằng thật là thừa khi có một hằng số đại diện cho giá trị nhỏ nhất có thể vì nó chỉ đơn giản là -cách xa MAX_VALUE:-)

(Lưu ý, cũng có Double.NEGATIVE_INFINITYnhưng tôi không quan tâm đến điều này, vì nó được coi là một "trường hợp đặc biệt" và thực tế không đại diện cho bất kỳ con số thực tế nào.)

Đây là một văn bản tốt về chủ đề này.


3
Cảm ơn vì điều đó. Tôi đã chuyển một số mã phân tích thống kê và dịch java một cách mù quáng sang C #. Tôi nhận thấy một số con số xuất hiện ở mức vô cực hoặc NaN và xem xét kỹ hơn về thuật toán. Tôi nhận ra rằng double.MIN_VALUE không có ý nghĩa gì trong ngữ cảnh và đã tìm kiếm. Bài đăng này xuất hiện trước các tài liệu java. Nó thực sự là một cái tên khó hiểu cho những gì thực sự là double.Epsilon. Không phải là một vấn đề lớn, mất ít hơn một phút để sửa chữa, nhưng chắc chắn đáng ngạc nhiên.
Ed S.

Không phải là "giá trị tuyệt đối nhỏ nhất có thể được biểu diễn" được đặt tên là "epsilon" sao?
Dave Cousineau

@Sahuagin, nó không thực sự "được cho là" được đặt tên bất cứ điều gì cụ thể. Epsilon chỉ là một chữ cái Hy Lạp thường đại diện cho một lượng dương nhỏ tùy ý trong toán học / vật lý. Đi chọn SmallestNonzeroFloat64ví dụ.
aioobe

12

Các hằng số này không có gì để làm với dấu hiệu. Điều này có ý nghĩa hơn nếu bạn coi một đôi như một tổng hợp của ba phần: Dấu hiệu, số mũ và Mantissa. Double.MIN_VALUE thực sự là giá trị nhỏ nhất mà Mantissa có thể giả định khi Exponent ở giá trị minimun trước khi xuất hiện 0 đến 0. Tương tự như vậy, MAX_VALUE có thể được hiểu là giá trị lớn nhất mà Mantissa có thể giả định khi Exponent có giá trị tối đa trước khi xuất hiện vô hạn.

Một tên mô tả nhiều hơn cho hai cái này có thể là Lớn nhất tuyệt đối (thêm khác không cho verbositiy) và giá trị nhỏ nhất tuyệt đối (thêm không vô cực cho verbositiy).

Kiểm tra tiêu chuẩn IEEE 754 (1985) để biết chi tiết. Có phiên bản sửa đổi (2008), nhưng chỉ giới thiệu nhiều định dạng hơn mà java không hỗ trợ (nói đúng java thậm chí còn thiếu hỗ trợ cho một số tính năng bắt buộc của IEEE 754 1985, giống như nhiều ngôn ngữ cấp cao khác).


4

Tôi giả sử các tên khó hiểu có thể được truy ngược lại thành C , được định nghĩa FLT_MINlà số dương nhỏ nhất.

Giống như trong Java, nơi bạn phải sử dụng -Double.MAX_VALUE, bạn phải sử dụng -FLT_MAXđể có được số float nhỏ nhất trong C.


3

Giá trị tối thiểu cho một đôi là Double.NEGATIVE_INFINITYtại sao Double.MIN_VALUEthực sự không phải là tối thiểu cho mộtDouble .

Vì số kép là số dấu phẩy động, bạn chỉ có thể có số lớn nhất (với độ chính xác thấp hơn) hoặc số gần nhất với 0 (với độ chính xác tuyệt vời).

Nếu bạn thực sự muốn một giá trị tối thiểu cho một gấp đôi không phải là vô cùng thì bạn có thể sử dụng -Double.MAX_VALUE.


1
Theo ý tưởng đó, giá trị tối đa cho Double Double.MAX_VALUE hay Double.POSITIVE_INFINITY?
mo-seph

Double.MIN_VALUEcó thể bằng Double.NEGATIVE_INFINITY.
starblue

@starblue, không. @ mo-seph ,, Double.POSITIVE_INFINITY+> mọi thứ và Mạnh and <mọi thứ
Colin Hebert

@Colin Hebert,> = và <= chính xác ;-)
aioobe

Có lẽ bạn đã hiểu lầm tôi. Trong một thế giới tốt hơn, Double.MIN_VALUEsẽ bằng Double.NEGATIVE_INFINITY, bởi vì sau đó nó sẽ phù hợp với MIN_VALUEcác kiểu số nguyên. Tôi có thể khởi tạo bất kỳ biến nào để tính toán tối đa MIN_VALUEvà nó sẽ đúng. Các Double.MIN_VALUEchúng ta có bây giờ sẽ có một cái tên hay hơn. (Và tương tự cho MAX_VALUE.)
starblue

2

Bởi vì với số dấu phẩy động, độ chính xác là điều quan trọng vì không có phạm vi chính xác .

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

Nhưng tôi đồng ý rằng nó có lẽ nên được đặt tên tốt hơn :)


OK, nhưng tại sao nó lại có ý nghĩa khi có Double.MAX_VALUE? Điều đó dường như được xác định rõ ràng.
mo-seph

bởi vì giá trị chính xác tối đa của nó (không vô hạn), không tính đến dấu hiệu của nó.
John Gardner

0

Như đã nói trong các tài liệu ,

Double.MIN_VALUE là một hằng số giữ giá trị khác không POSITIVE nhỏ nhất của loại double, 2 ^ (- 1074).

Mẹo ở đây là chúng ta đang nói về một đại diện số dấu phẩy động. Kiểu dữ liệu kép là điểm nổi 64-bit 64-bit độ chính xác kép. Điểm nổi biểu thị các số từ 1.000.000.000.000 đến 0,0000000000000101 một cách dễ dàng và trong khi tối đa hóa độ chính xác (số chữ số) ở cả hai đầu của thang đo. (Để biết thêm tham khảo này )

Các mantissa, luôn luôn là một số dương , giữ các chữ số đáng kể của số dấu chấm động. Số mũ biểu thị công suất dương hoặc âm của cơ số mà lớp phủ và dấu cần được nhân với. Bốn thành phần được kết hợp như sau để có được giá trị dấu phẩy động.

nhập mô tả hình ảnh ở đây

Hãy nghĩ rằng MIN_VALUE là giá trị tối thiểu mà lớp phủ có thể đại diện. Vì các giá trị tối thiểu của biểu diễn dấu phẩy động là cường độ tối thiểu có thể được biểu diễn bằng cách sử dụng giá trị đó. (Có thể đã sử dụng một tên tốt hơn để tránh sự nhầm lẫn này)

123> 10> 1> 0,12> 0,012> 0,0000123> 0,00000000001> 0,000000000000000001


Dưới đây chỉ là FYI.

Điểm nổi chính xác kép có thể đại diện cho 2.098 sức mạnh của hai, từ 2 ^ -1074 đến 2 ^ 1023. Sức mạnh phi thường của hai là những người từ 2 ^ -1074 đến 2 ^ -1023; quyền hạn chuẩn hóa của hai là những người từ 2 ^ -1022 đến 2 ^ 1023. Tham khảo cái nàycái này .


Cảm ơn bạn! Tôi không biết tại sao câu trả lời này bị hạ thấp.
Kết hợp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.