2 ** x เร็วกว่าในการคำนวณกว่า exp (x) หรือไม่


12

ยกโทษให้naïvetéที่จะชัดเจนในวิธีที่ฉันถามคำถามนี้รวมทั้งความจริงที่ว่าฉันถามมัน

นักคณิตศาสตร์มักใช้เนื่องจากเป็นฐานที่ง่ายที่สุด / อร่อยที่สุดในทางทฤษฎี (เนื่องจากแคลคูลัส) แต่คอมพิวเตอร์ดูเหมือนว่าจะทำทุกอย่างเป็นเลขฐานสองดังนั้นคอมพิวเตอร์จะคำนวณได้เร็วกว่าหรือเปล่าexp2**xMath::exp(x)


7
คุณพูดถึงเรื่องอะไร จำนวนเต็มขนาด Arbitary? จุดลอยตัวขนาดคงที่? จุดลอยตัวที่เที่ยงตรงแม่นยำ?
Gilles 'SO- หยุดความชั่วร้าย'

@Gilles มันเป็นจุดที่ดี ฉันไม่ได้ตระหนักถึงความแตกต่างเป็นสิ่งสำคัญ
มอร์ฟิซึ่มส์

3
ผมเคยเห็นในบาง Casio เครื่องคิดเลขกระเป๋าที่บันทึกและพลังของจำนวนที่ไม่ใช่อีช้ากว่า LN / ประสบการณ์
phuclv

2
หากต้องการเสี่ยงต่อการทื่อคุณลองจับเวลาดูทั้งคู่ดูว่าเร็วกว่ากันไหม หรือคุณกำลังพูดถึงความเร็วในความซับซ้อนของ ? O(f(n))
jmite

1
ภาษามีหน้าที่ในการเลือกวิธีที่เร็วที่สุดและจะทำงานได้ดี เฉพาะในกรณีที่จำเป็นต้องใช้ความเร็วสูงสุดและการวัดแสดงให้เห็นว่าสิ่งนี้เกี่ยวข้องกับประสิทธิภาพการทำงานหากคุณกังวลเกี่ยวกับสิ่งต่าง ๆ นี้
vonbrand

คำตอบ:


18

เนื่องจากนี่คือ CS ไม่ใช่ Stackoverflow ฉันจะสมมติว่าคุณกำลังถามคำถามเกี่ยวกับการวิเคราะห์เชิงตัวเลขและ (เพื่อให้ทุกอย่างง่ายขึ้น) จุดลอยตัว IEEE-754 โดยเฉพาะ ในกรณีนั้นคำตอบสำหรับคำถามของคุณส่วนหนึ่งขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ง่ายขึ้น" และส่วนหนึ่งของรายละเอียดของระบบ

exexp2xexp2

เป็นกรณีที่มีวิธีการตัวเลขทั้งหมดสำหรับการดำเนินงานที่ยอดเยี่ยมมีบางกรณีพิเศษที่ควรพิจารณา:

exp(NaN) = NaN
exp(+Inf) = +Inf
exp(-Inf) = 0

exp(x)x<104x>88.7exp(x)1.0xexp2

ex=2x/ln21ln2exp2K

exp2(x)=2n×T[j]×P(y)

nxT2j/Kj[0,K)P2x[0,1K)2nTP

f2xm12x1x[1,1]

แม้ว่า x87 รองรับคำแนะนำที่ยอดเยี่ยม แต่การใช้งานซอฟต์แวร์ห้องสมุดของฟังก์ชันอดิศัยนั้นสามารถทำได้เร็วกว่าในหลายกรณี

แก้ไข:มีการชี้ให้เห็นในความคิดเห็นที่ฉันควรอธิบายคำศัพท์ใหม่ที่ใช้ใน IEEE 754-2008 ภาษาบางภาษามีการเปลี่ยนแปลงตั้งแต่ปี 1985 และ 1987 และคนส่วนใหญ่คุ้นเคยกับศัพท์แสงเก่า

คำว่า "binary32" และ "binary64" เป็นชื่อใหม่สำหรับเลขทศนิยมเลขฐานสองแบบ 32- บิตและ 64- บิตซึ่งมาตรฐานเก่าเรียกว่า "single" และ "double" ตามลำดับ

คำว่า "จำนวนต่ำกว่าปกติ" แทนคำก่อนหน้านี้"จำนวน denormal" หรือ "จำนวน denormalized"


เมื่อคุณพูดว่า "subnormal" - คุณไม่ได้หมายถึง "sub-Gaussian" อย่างชัดเจน คุณหมายถึง "แย่กว่า [มาตรฐานบางอย่างที่เป็นมาตรฐาน]" หรือไม่?
มอร์ฟิซึ่มส์

2
@ isomorphismes ที่นี่ 'subnormal' นั้นเกี่ยวกับวิธีการใช้งานของการลอยตัว ดูตัวเลขที่ผิดปกติใน Wikipedia
พอล Manta

อนึ่งฉันทำเกินความจริง "วิธีการทั่วไป" เพียงเล็กน้อย เป็นไปได้ที่จะใช้ exp2 () และ exp () ด้วยความแม่นยำของ ulp โดยใช้ส่วนขยายเล็ก ๆ (และค่อนข้างเข้าใจง่าย) เพียงหนึ่งเดียวกับวิธีที่นำเสนอไว้ที่นี่ แต่คำอธิบายของส่วนขยายที่เข้าใจง่ายขนาดเล็ก คำตอบ!
นามแฝง

6

2**x2x<<1 << x


4
ไม่จริง x อาจเป็นชนิด
อิงดัชนี

1
x

หากxไม่ใช่จำนวนเต็ม (พูด20.75) คุณจะต้องตั้งค่าแมนทิสซาเป็น2และเลขชี้กำลังเป็นค่าที่ปัดเศษxเป็นค่าประมาณที่แม่นยำที่สุด (ไม่สามารถแสดงค่าได้อย่างแม่นยำ) ซึ่งก็เช่นกันเร็วกว่า `pow´
Damon

1

ถ้า2**xฟังก์ชั่นเป็นจำนวนเต็มฉันเห็นด้วยกับคำตอบของสตีเฟ่น แต่ฉันมักจะเห็นว่าเป็น2^xและ**เพื่อบ่งชี้การยกกำลังจุดลอยตัว สำหรับกรณีนี้ฉันคาดหวังว่าประสิทธิภาพที่คล้ายกันระหว่าง**และ^เนื่องจากทั้งสองexpและpow(การดำเนินการพื้นฐานสำหรับ**) เป็นการดำเนินการประมาณยอดเยี่ยม


น่าสนใจฉันไม่ทราบว่า**ถือเป็นคำพ้องความหมายสำหรับรุ่นเลขทศนิยม (และโง่ฉันฉันลืมทั้งสองจะแตกต่างกัน)
มอร์ฟิซึ่มส์

1

ตั้งแต่ 2 ^ x = e ^ (x * ln 2) และ e ^ x = 2 ^ (x * log2 (e)) คุณจะไม่คาดหวังความแตกต่างมากนัก

สำหรับ x ใกล้กับศูนย์เรามักจะใช้พหุนาม e ^ x = 1 + x + x ^ 2/2 + x ^ 3/6 ... ได้รับการปรับปรุงให้ดีที่สุดที่จะตัดโดยเร็วที่สุดเท่าที่จะเป็นไปได้ . เห็นได้ชัดว่า 2 ^ x เป็นการคำนวณที่ช้ากว่าเล็กน้อย "x ใกล้กับ 0" มักจะเป็นค่าของ x โดย sqrt (1/2) <= e ^ x <= sqrt (2) การ จำกัด ช่วงของ x ทำให้แน่ใจว่าไม่จำเป็นต้องเลือกระดับพหุนามสูงเกินไป

สำหรับ x ที่ใหญ่กว่าปกติจะคำนวณ 2 ^ x โดยให้ x = x '+ x' 'โดยที่ x' เป็นจำนวนเต็มและ -0.5 <= x '' <= 0.5 2 ^ x 'จะถูกคำนวณโดยการสร้างเลขทศนิยมที่มีรูปแบบบิตที่ถูกต้องและ 2 ^ x' 'โดยใช้วิธี e ^ x สำหรับ x ขนาดเล็ก ที่นี่ 2 ^ x เร็วขึ้นเล็กน้อย ยิ่งกว่านั้นถ้า x มีค่ามาก (พูด x = 100.3) เพียงแค่คูณ x ด้วย log2 (e) จะทำให้เกิดข้อผิดพลาดในการปัดเศษที่ไม่สามารถยอมรับได้

และหวังว่าฟังก์ชั่นห้องสมุดที่ดีจะดูแลเมื่อใดก็ตามที่ x <= y, e ^ x <= e ^ y และ 2 ^ x <= 2 ^ y ไม่ว่าข้อผิดพลาดในการปัดเศษจะเป็นอย่างไร การบรรลุสิ่งนั้นอาจเป็นเรื่องยาก


0

คุณต้องเข้าใจว่าคณิตศาสตร์ในคอมพิวเตอร์นั้นทำได้หลายวิธีด้วยซอฟต์แวร์ที่ต่างกันหวังว่าจะได้คำตอบที่สอดคล้องกัน ดูซอฟต์แวร์ส่วนใหญ่ฉันคิดว่าคอมพิวเตอร์ทำงานได้ดี - คอมพิวเตอร์และจะคำนวณคำตอบในระยะยาวแม้กระทั่งเช่น 0 ^ 0 ปัญหาคือกรณีพิเศษเกี่ยวข้องกับ "การรับรู้" ซึ่งไม่ได้เกิดขึ้นฟรีในคอมพิวเตอร์ดิจิตอล ซึ่งหมายความว่าเฉพาะในกรณีที่มีคำตอบเท่านั้นที่จะทำให้เกิดประโยชน์สูงสุด "มากที่สุด" จะเกิดประสิทธิภาพสูงสุด แต่ในกรณีเหล่านั้นมันจะเกิดขึ้นอย่างดีมาก นอกจากนี้โปรดทราบว่าอาจต้องมีการจดจำที่แตกต่างกันหลายอย่างเพื่อให้ได้คำตอบที่ถูกต้อง สิ่งนี้เรียกว่าระดับการเพิ่มประสิทธิภาพความเร็วและสิ่งนี้เกิดขึ้นในระดับมืออาชีพสูงสุดในพื้นฐานของซอฟต์แวร์ส่วนใหญ่ที่เรียกว่า GNU "C" นี่เป็นเพราะที่นี่แตกต่างนาทีในเวลาทำงานจากซอฟต์แวร์ซอฟต์แวร์และเครื่องไปยังเครื่องที่ใช้เป็นตัวเลขการยอมรับคุณภาพ ในล่ามอื่น ๆ มักจะเกิดขึ้นหาก "การตั้งค่าสถานะเป็นศูนย์" เกิดขึ้นเนื่องจากผลข้างเคียงของการคำนวณก่อนหน้านี้จะทำให้การจดจำเร็วขึ้น เช่น 0 * x => C0

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