เหตุใด Double.MIN_VALUE จึงไม่ติดลบ


157

ทุกคนสามารถให้ความกระจ่างเกี่ยวกับสาเหตุที่Double.MIN_VALUEไม่จริงค่าต่ำสุดที่เป็นสองเท่าสามารถใช้? มันเป็นค่าบวกและแน่นอนว่า Double กระป๋องนั้นจะเป็นค่าลบ

ฉันเข้าใจว่าทำไมมันเป็นจำนวนที่มีประโยชน์ แต่ดูเหมือนว่าชื่อ unintuitive Integer.MIN_VALUEมากโดยเฉพาะเมื่อเทียบกับ การโทรหามันDouble.SMALLEST_POSITIVEหรือMIN_INCREMENTคล้ายกันจะมีความหมายชัดเจนกว่า

นอกจากนี้ค่าต่ำสุดที่ Doubles สามารถรับได้คือเท่าใด มันคือ-Double.MAX_VALUEอะไร เอกสารดูเหมือนจะไม่พูด


1
ขอบคุณสำหรับคำตอบ! ความแตกต่างระหว่างช่วงและความแม่นยำเหมาะสม ฉันยังพบว่าการตั้งชื่อค่อนข้างแปลกและไม่สอดคล้องกัน แต่ใช้งานได้
mo-seph

1
ฉันคาดเดาเพราะมันเขียนโดยอัจฉริยะเดียวกันที่เรียกว่าวิธีการที่จะใช้เวลาwriteBytes String
Trejkaz

โดยทั่วไปคุณพูดถูกแล้วมันเป็นความหมายที่ไม่ดี
Alvaro

คำตอบ:


180

รูปแบบ IEEE 754 มีหนึ่งบิตที่สงวนไว้สำหรับเครื่องหมายและบิตที่เหลือแทนขนาด นี่หมายความว่ามันเป็น "สมมาตร" รอบ ๆ โอริโก (ตรงข้ามกับค่าจำนวนเต็มซึ่งมีค่าลบมากกว่าหนึ่ง) ดังนั้นค่าต่ำสุดเป็นเพียงเช่นเดียวกับค่าสูงสุดที่มีการลงชื่อเข้าใช้บิตการเปลี่ยนแปลงเพื่อให้ใช่ , เป็นจำนวนที่เล็กที่สุดที่เป็นไปได้จริงที่คุณสามารถเป็นตัวแทนด้วย-Double.MAX_VALUEdouble

ผมสมมติว่าDouble.MAX_VALUEควรจะเห็นเป็นความสำคัญสูงสุด-Double.MAX_VALUEซึ่งในกรณีนี้มันเป็นจริงจะทำให้ความรู้สึกที่จะเพียงแค่เขียน นอกจากนี้ยังอธิบายว่าเพราะเหตุใดจึงDouble.MIN_VALUEเป็นค่าบวกน้อยที่สุด (เนื่องจากนั่นหมายถึงขนาดที่เล็กที่สุดที่เป็นไปได้)

แต่แน่นอนฉันเห็นด้วยว่าการตั้งชื่อนั้นทำให้เข้าใจผิดเล็กน้อย เมื่อคุ้นเคยกับความหมายInteger.MIN_VALUEฉันก็รู้สึกประหลาดใจเล็กน้อยเมื่อฉันอ่านนั่นDouble.MIN_VALUEคือค่าสัมบูรณ์ที่เล็กที่สุดที่สามารถเป็นตัวแทนได้ บางทีพวกเขาคิดว่ามันฟุ่มเฟือยที่จะมีค่าคงที่เป็นตัวแทนของค่าน้อยที่สุดเพราะมันอยู่-ห่างจากMAX_VALUE:-)

(หมายเหตุยังมีDouble.NEGATIVE_INFINITYแต่ฉันไม่สนใจสิ่งนี้เนื่องจากมันถูกมองว่าเป็น "กรณีพิเศษ" และในความเป็นจริงไม่ได้แสดงถึงจำนวนจริงใด ๆ )

นี่คือข้อความที่ดีในเรื่อง


3
ขอบคุณสำหรับสิ่งนี้. ฉันกำลังย้ายรหัสการวิเคราะห์เชิงสถิติและแปล Java เป็น C # อย่างสุ่มสี่สุ่มห้า ฉันสังเกตเห็นว่ามีตัวเลขบางตัวออกมาที่ -infinity หรือ NaN และดูอัลกอริทึมให้ละเอียดยิ่งขึ้น ฉันตระหนักว่า double.MIN_VALUE ไม่มีความหมายในบริบทและทำการค้นหา โพสต์นี้เกิดขึ้นก่อนเอกสาร java มันเป็นชื่อที่สับสนสำหรับสิ่งที่เป็นคู่จริงๆเอปไซลอน ไม่ใช่เรื่องใหญ่ใช้เวลาน้อยกว่าหนึ่งนาทีในการแก้ไข แต่ก็น่าแปลกใจอย่างแน่นอน
Ed S.

ไม่ใช่ "ค่าสัมบูรณ์ที่เล็กที่สุดที่สามารถเป็นตัวแทนได้" ควรจะตั้งชื่อว่า 'epsilon' หรือไม่?
Dave Cousineau

@Sahuagin ไม่ใช่ "ควร" จริงๆที่จะตั้งชื่ออะไรเป็นพิเศษ Epsilon เป็นเพียงตัวอักษรกรีกที่มักจะแสดงปริมาณบวกเล็ก ๆ โดยพลในวิชาคณิตศาสตร์ / ฟิสิกส์ ไปเลือกSmallestNonzeroFloat64เช่น
aioobe

12

ค่าคงที่เหล่านี้ไม่มีส่วนเกี่ยวข้องกับเครื่องหมาย วิธีนี้เหมาะสมกว่าหากคุณพิจารณาว่าเป็นสองเท่าของคอมโพสิตสามส่วน: ลงชื่อ, เลขชี้กำลังและ Mantissa Double.MIN_VALUE เป็นค่าที่น้อยที่สุด Mantissa สามารถสันนิษฐานได้ว่าเมื่อ Exponent เป็นค่า minimun ก่อนที่ flush เป็นศูนย์จะเกิดขึ้น ในทำนองเดียวกัน MAX_VALUE สามารถเข้าใจได้เนื่องจากค่าที่ใหญ่ที่สุด Mantissa สามารถสันนิษฐานได้ว่าเมื่อค่า Exponent เป็นค่าสูงสุดก่อนที่จะเกิดฟลัชถึงอินฟินิตี้

ชื่อที่มีความหมายมากขึ้นสำหรับทั้งสองนี้อาจเป็นค่าสัมบูรณ์ที่ใหญ่ที่สุด (เพิ่มที่ไม่ใช่ศูนย์สำหรับ verbositiy) และค่าสัมบูรณ์ที่เล็กที่สุด (เพิ่มค่าที่ไม่ใช่ค่าไม่สิ้นสุดสำหรับ verbositiy)

ตรวจสอบรายละเอียดมาตรฐาน IEEE 754 (1985) มีรุ่นที่ได้รับการแก้ไข (2008) แต่มีการแนะนำเฉพาะรูปแบบเพิ่มเติมที่ไม่ได้รับการสนับสนุนจากจาวา (การพูดภาษาจาวาอย่างเคร่งครัดแม้จะขาดการสนับสนุนคุณสมบัติบังคับของ IEEE 754 1985 เช่นภาษาระดับสูงอื่น ๆ )


4

ฉันคิดว่าชื่อที่สับสนสามารถสืบย้อนกลับไปที่ Cซึ่งกำหนดFLT_MINเป็นจำนวนบวกที่เล็กที่สุด

เช่นเดียวกับใน Java ที่คุณต้องใช้-Double.MAX_VALUEคุณต้องใช้-FLT_MAXเพื่อให้ได้ float ที่เล็กที่สุดใน C


3

มูลค่าขั้นต่ำสำหรับคู่Double.NEGATIVE_INFINITYที่ว่าทำไมไม่ได้จริงๆขั้นต่ำสำหรับDouble.MIN_VALUEDouble

เนื่องจากเลขสองตัวเป็นตัวเลขทศนิยมคุณสามารถมีได้จำนวนมากที่สุด (ด้วยความแม่นยำที่ต่ำกว่า) หรือตัวเลขที่ใกล้เคียงที่สุดถึง 0 (ด้วยความแม่นยำที่ยอดเยี่ยม)

-Double.MAX_VALUEหากคุณต้องการมีค่าน้อยที่สุดสำหรับคู่ที่ไม่ได้เป็นอินฟินิตี้แล้วคุณสามารถใช้จริงๆ


1
ตามแนวคิดดังกล่าวแล้วค่าสูงสุดสำหรับ Double Double คือ MAX_VALUE หรือ Double.POSITIVE_INFINITY หรือไม่
mo-seph

Double.MIN_VALUEDouble.NEGATIVE_INFINITYอาจจะเท่ากับ
starblue

@ starblue ไม่ @ mo-seph,, Double.POSITIVE_INFINITY+ ∞> ทุกอย่างและ —∞ <ทุกอย่าง
Colin Hebert

@Colon Hebert,> = และ <= เพื่อให้แม่นยำ ;-)
aioobe

คุณอาจเข้าใจฉันผิด ในโลกที่ดีกว่าDouble.MIN_VALUEจะเท่ากับDouble.NEGATIVE_INFINITYเพราะจากนั้นมันจะสอดคล้องกับMIN_VALUEในประเภทจำนวนเต็ม ฉันสามารถเริ่มต้นตัวแปรใด ๆ สำหรับการคำนวณสูงสุดด้วยMIN_VALUEและมันจะถูกต้อง Double.MIN_VALUEเรามีตอนนี้จะมีชื่อที่ดีกว่า (และสำหรับแบบMAX_VALUE
อะนาล็อก

2

เพราะมีตัวเลขลอยจุดที่แม่นยำเป็นสิ่งที่มีความสำคัญเช่นไม่มีช่วงที่แน่นอน

/**
 * 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>.
 */

แต่ฉันยอมรับว่ามันน่าจะเป็นชื่อที่ดีกว่า :)


ตกลง แต่ทำไมจึงมีเหตุผลที่จะมี Double.MAX_VALUE ดูเหมือนว่าจะมีการกำหนดไว้อย่างชัดเจน
mo-seph

เนื่องจากเป็นค่าที่แม่นยำสูงสุด (ไม่ใช่อนันต์) ไม่ใช่การบัญชีสำหรับเครื่องหมาย
John Gardner

0

ตามที่กล่าวในเอกสาร ,

Double.MIN_VALUE เป็นคงถือที่เล็กที่สุดเป็นบวกค่าไม่ใช่ศูนย์ประเภทคู่ 2 ^ (- 1074)

เคล็ดลับที่นี่คือเรากำลังพูดถึงการเป็นตัวแทนจำนวนจุดลอยตัว ประเภทข้อมูลคู่เป็นทศนิยม 64 บิต IEEE 754 ที่มีความแม่นยำสองเท่า จุดลอยแทนตัวเลขจาก1,000,000,000,000เพื่อ0.0000000000000001ได้อย่างง่ายดายและในขณะที่การเพิ่มความแม่นยำ (จำนวนตัวเลข) ที่ปลายทั้งสองของขนาด (เพื่อเพิ่มเติมอ้างอิงนี้ )

mantissa เสมอเป็นจำนวนบวกชูเลขนัยสำคัญของจำนวนจุดลอยตัว เลขชี้กำลังแสดงกำลังบวกหรือลบของ radix ที่ mantissa และเครื่องหมายควรคูณด้วย ส่วนประกอบทั้งสี่ถูกรวมกันดังต่อไปนี้เพื่อรับค่าทศนิยม

ป้อนคำอธิบายรูปภาพที่นี่

คิดว่า MIN_VALUE เป็นค่าต่ำสุดที่ mantissa สามารถเป็นตัวแทนได้ ในฐานะที่เป็นค่าต่ำสุดของการเป็นตัวแทนจุดลอยตัวเป็นขนาดขั้นต่ำที่สามารถแสดงโดยใช้ที่ (อาจใช้ชื่อที่ดีกว่าเพื่อหลีกเลี่ยงความสับสนนี้)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001


ด้านล่างเป็นเพียง FYI

จำนวนจุดลอยตัวที่มีความแม่นยำสองเท่าสามารถแสดงถึง 2,098 พลังของสองจาก 2 ^ -1074 ถึง 2 ^ 1023 พลังที่ลดทอนของสองคือตั้งแต่ 2 ^ -1074 ถึง 2 ^ -1023; กำลังมาตรฐานของสองคือตั้งแต่ 2 ^ -1022 ถึง 2 ^ 1023 อ้างถึงนี้และนี้


ขอบคุณ! ฉันไม่รู้ว่าทำไมคำตอบนี้จึงถูกลดระดับลง
รวม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.