คำถามติดแท็ก arithmetic

คำถามเกี่ยวกับการใช้การคำนวณทางคณิตศาสตร์เบื้องต้นบนคอมพิวเตอร์ที่มีฮาร์ดแวร์หรืออัลกอริทึม ตัวเลขมักจะถือว่าอยู่ในการแทนค่าฐานสองเพิ่มแท็ก [floating-point] สำหรับการคำนวณทางคณิตศาสตร์กับตัวเลขในการแทนค่าทศนิยม

9
ทำไมการเพิ่มความเร็วอย่างรวดเร็วเท่ากับการทำงานที่ชาญฉลาดในโปรเซสเซอร์รุ่นใหม่?
ฉันรู้ว่าการทำงานของ bit-wise นั้นรวดเร็วสำหรับตัวประมวลผลที่ทันสมัยเนื่องจากสามารถทำงานกับ 32 หรือ 64 บิตในแบบขนานดังนั้นการดำเนินงาน bit-wise จึงใช้เวลาเพียงหนึ่งรอบนาฬิกา อย่างไรก็ตามการเพิ่มเป็นการดำเนินการที่ซับซ้อนซึ่งประกอบด้วยการดำเนินการอย่างน้อยหนึ่งอย่างและอาจเป็นถึงการดำเนินการที่ชาญฉลาดจำนวนโหลดังนั้นฉันจึงคิดว่ามันจะช้าลง 3-4 เท่า ฉันรู้สึกประหลาดใจที่ได้เห็นมาตรฐานที่เรียบง่ายว่าการเพิ่มนั้นเร็วพอ ๆ กับการดำเนินการที่ชาญฉลาด (XOR, OR และอื่น ๆ ) ทุกคนสามารถหลั่งน้ำตาแสงนี้

3
อัลกอริธึมแบบแฟคทอเรียลมีประสิทธิภาพมากกว่าการคูณแบบไร้เดียงสา
ฉันรู้วิธีเขียนโค้ดสำหรับแฟคทอเรียลที่ใช้ทั้งแบบวนซ้ำและวนซ้ำ (เช่นn * factorial(n-1)สำหรับตัวอย่าง) ฉันอ่านในตำราเรียน (โดยไม่ได้รับคำอธิบายเพิ่มเติมใด ๆ ) ว่ามีวิธีที่มีประสิทธิภาพยิ่งขึ้นในการเขียนโปรแกรมสำหรับแฟคทอเรียลด้วยการแบ่งครึ่งแบบวนซ้ำ ฉันเข้าใจว่าทำไมถึงเป็นเช่นนั้น อย่างไรก็ตามฉันต้องการลองเขียนโค้ดด้วยตัวเองและฉันไม่คิดว่าจะเริ่มต้นอย่างไร เพื่อนแนะนำให้ฉันเขียนเคสพื้นฐานก่อน และฉันกำลังคิดที่จะใช้อาร์เรย์เพื่อให้ฉันสามารถติดตามตัวเลข ... แต่ฉันไม่เห็นวิธีการออกแบบรหัสดังกล่าว ฉันควรค้นคว้าเทคนิคแบบใด

6
คณิตศาสตร์ที่อยู่เบื้องหลังการแปลงจากฐานใด ๆ เป็นฐานใด ๆ โดยไม่ต้องผ่านฐาน 10?
ฉันได้ดูคณิตศาสตร์ที่อยู่เบื้องหลังการแปลงจากฐานใด ๆ เป็นฐานใด ๆ นี่คือเพิ่มเติมเกี่ยวกับการยืนยันผลลัพธ์ของฉันมากกว่าสิ่งใด ฉันพบสิ่งที่ดูเหมือนจะเป็นคำตอบของฉันใน mathforum.org แต่ฉันก็ยังไม่แน่ใจว่าฉันทำถูก ฉันมีการแปลงจากฐานขนาดใหญ่ไปเป็นฐานที่เล็กลงโอเคเพราะมันแค่ใช้ตัวเลขแรกคูณด้วยฐานที่คุณต้องการเพิ่มตัวเลขหลักถัดไป ปัญหาของฉันมาเมื่อแปลงจากฐานขนาดเล็กเป็นฐานขนาดใหญ่ เมื่อทำสิ่งนี้พวกเขาพูดถึงวิธีที่คุณต้องการแปลงฐานขนาดใหญ่ที่คุณต้องการเป็นฐานขนาดเล็ก ตัวอย่างจะไปจากฐาน 4 ถึงฐาน 6 คุณต้องแปลงหมายเลข 6 เป็นฐาน 4 รับ 12 จากนั้นคุณทำสิ่งเดียวกับที่คุณทำเมื่อคุณแปลงจากใหญ่ไปเล็ก ความยากลำบากที่ฉันมีกับมันดูเหมือนว่าคุณจำเป็นต้องรู้ว่าตัวเลขหนึ่งอยู่ในฐานอื่น ดังนั้นฉันจึงต้องการที่จะรู้ว่า 6 อยู่ในฐาน 4 นี้สร้างปัญหาใหญ่ในใจของฉันเพราะแล้วฉันจะต้องมีตาราง ไม่มีใครรู้วิธีการทำเช่นนี้ในแบบที่ดีขึ้น ฉันคิดว่าการแปลงพื้นฐานจะช่วยได้ แต่ฉันหางานนั้นไม่เจอ และจากเว็บไซต์ฉันพบว่ามันช่วยให้คุณสามารถแปลงจากฐานหนึ่งเป็นฐานโดยไม่ต้องผ่านฐาน 10 แต่ก่อนอื่นคุณต้องรู้วิธีแปลงหมายเลขแรกจากฐานหนึ่งไปเป็นฐาน นั่นทำให้มันไร้จุดหมาย ผู้แสดงความคิดเห็นพูดว่าฉันต้องสามารถแปลงตัวอักษรให้เป็นตัวเลขได้ ถ้าเป็นเช่นนั้นฉันรู้แล้วว่า นั่นไม่ใช่ปัญหาของฉัน ปัญหาของฉันคือการแปลงฐานขนาดใหญ่เป็นฐานขนาดเล็กฉันต้องแปลงหมายเลขฐานที่ฉันมีเป็นหมายเลขฐานที่ฉันต้องการก่อน ในการทำเช่นนี้ฉันจะเอาชนะวัตถุประสงค์เพราะถ้าฉันมีความสามารถในการแปลงฐานเหล่านี้ไปยังฐานอื่นฉันได้แก้ไขปัญหาของฉันแล้ว แก้ไข: ฉันหาวิธีแปลงจากฐานที่น้อยกว่าหรือเท่ากับ 10 เป็นฐานอื่น ๆ ที่น้อยกว่าหรือเท่ากับ 10 ฉันยังสามารถเปลี่ยนจากฐานที่มากกว่า 10 เป็นฐานใด …

2
เหตุใด C ประเภทโมฆะจึงไม่คล้ายกับประเภทที่ว่าง / ด้านล่าง
Wikipedia ตลอดจนแหล่งข้อมูลอื่น ๆ ที่ฉันได้พบรายการvoidประเภทC เป็นหน่วยประเภทซึ่งตรงข้ามกับประเภทที่ว่างเปล่า ฉันพบว่ามันสับสนเพราะฉันคิดว่าvoidเหมาะกับนิยามของประเภทที่ว่าง / ล่าง ไม่มีค่านิยมใด ๆ อยู่voidเท่าที่ฉันจะบอกได้ ฟังก์ชั่นที่มีประเภทคืนค่าเป็นโมฆะระบุว่าฟังก์ชั่นจะไม่ส่งคืนสิ่งใดดังนั้นจึงสามารถทำงานได้เพียงผลข้างเคียงเท่านั้น ตัวชี้ชนิดvoid*เป็นชนิดย่อยของชนิดตัวชี้อื่นทั้งหมด นอกจากนี้การแปลงไปยังและจากvoid*ใน C นั้นเป็นนัย ผมไม่แน่ใจว่าถ้าจุดสุดท้ายมีบุญใด ๆ ที่เป็นข้อโต้แย้งสำหรับvoidการเป็นประเภทที่ว่างเปล่าเป็นมากหรือน้อยเป็นกรณีพิเศษที่มีความสัมพันธ์ไม่มากที่จะvoid*void ในทางกลับกันvoidตัวมันเองไม่ใช่ประเภทย่อยของประเภทอื่นทั้งหมดซึ่งเท่าที่ฉันสามารถบอกได้ว่าเป็นข้อกำหนดสำหรับประเภทที่จะเป็นประเภทด้านล่าง
28 type-theory  c  logic  modal-logic  coq  equality  coinduction  artificial-intelligence  computer-architecture  compilers  asymptotics  formal-languages  asymptotics  landau-notation  asymptotics  turing-machines  optimization  decision-problem  rice-theorem  algorithms  arithmetic  floating-point  automata  finite-automata  data-structures  search-trees  balanced-search-trees  complexity-theory  asymptotics  amortized-analysis  complexity-theory  graphs  np-complete  reductions  np-hard  algorithms  string-metrics  computability  artificial-intelligence  halting-problem  turing-machines  computation-models  graph-theory  terminology  complexity-theory  decision-problem  polynomial-time  algorithms  algorithm-analysis  optimization  runtime-analysis  loops  turing-machines  computation-models  recurrence-relation  master-theorem  complexity-theory  asymptotics  parallel-computing  landau-notation  terminology  optimization  decision-problem  complexity-theory  polynomial-time  counting  coding-theory  permutations  encoding-scheme  error-correcting-codes  machine-learning  natural-language-processing  algorithms  graphs  social-networks  network-analysis  relational-algebra  constraint-satisfaction  polymorphisms  algorithms  graphs  trees 

6
GCD มีประสิทธิภาพมากที่สุดคืออะไร
ฉันรู้ว่าอัลกอริทึมของ Euclid เป็นอัลกอริทึมที่ดีที่สุดในการรับ GCD (ตัวหารร่วมมาก) ของรายการจำนวนเต็มบวก แต่ในทางปฏิบัติคุณสามารถเขียนโค้ดอัลกอริทึมนี้ได้หลายวิธี (ในกรณีของฉันฉันตัดสินใจใช้ Java แต่ C / C ++ อาจเป็นตัวเลือกอื่น) ฉันต้องใช้รหัสที่มีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้ในโปรแกรมของฉัน ในโหมดเรียกซ้ำคุณสามารถเขียน: static long gcd (long a, long b){ a = Math.abs(a); b = Math.abs(b); return (b==0) ? a : gcd(b, a%b); } และในโหมดวนซ้ำดูเหมือนว่า: static long gcd (long a, long b) { long r, i; …


4
ความไม่เสมอภาคที่เกิดจากความไม่ถูกต้องลอย
อย่างน้อยใน Java ถ้าฉันเขียนรหัสนี้: float a = 1000.0F; float b = 0.00004F; float c = a + b + b; float d = b + b + a; boolean e = c == d; ค่าของจะฉลิตรsอี ฉันเชื่อว่าสิ่งนี้เกิดจากข้อเท็จจริงที่ว่าการลอยตัวนั้นมีข้อ จำกัด อย่างมากในการแสดงตัวเลขอย่างแม่นยำ แต่ฉันไม่เข้าใจว่าทำไมแค่การเปลี่ยนตำแหน่งของaอาจทำให้ความไม่เท่าเทียมนี้เกิดขึ้นeeefalsefalsefalseaaa ฉันลด s เป็นหนึ่งในทั้งบรรทัด 3 และ 4 ดังด้านล่างค่าของeอย่างไรก็ตามกลายเป็นt r u e :bbbeeetruetruetrue float …


3
เวลาที่ซับซ้อนของการเพิ่ม
Wikipedia แสดงความซับซ้อนของเวลาในการเพิ่มเป็นโดยที่nคือจำนวนบิตnnnnnn นี่เป็นขอบเขตล่างที่แข็งทฤษฏีหรือไม่? หรือนี่เป็นเพียงความซับซ้อนของอัลกอริทึมที่เร็วที่สุดที่รู้จักกันในปัจจุบัน ฉันต้องการทราบว่าเนื่องจากความซับซ้อนของการเพิ่มให้ขีดการดำเนินการทางคณิตศาสตร์อื่น ๆ ทั้งหมดและอัลกอริทึมทั้งหมดที่ใช้พวกเขา มันเป็นไปไม่ได้ในทางทฤษฎีหรือไม่ที่จะได้อัลกอริธึมเพิ่มเติมที่ทำงานใน ? หรือเราผูกพันกับความซับซ้อนเชิงเส้นเพื่อเพิ่มเติมo ( n )o(n)o(n)

9
แสดงจำนวนจริงโดยไม่สูญเสียความแม่นยำ
จุดลอยตัวปัจจุบัน (ANSI C float, double) อนุญาตให้แสดงการประมาณจำนวนจริง มีวิธีใดที่จะแสดงจำนวนจริงโดยไม่มีข้อผิดพลาด ? นี่คือความคิดที่ฉันมีซึ่งเป็นอะไร แต่สมบูรณ์แบบ ตัวอย่างเช่น 1/3 คือ 0.33333333 ... (ฐาน 10) หรือ o.01010101 ... (ฐาน 2) แต่ยัง 0.1 (ฐาน 3) เป็นความคิดที่ดีที่จะใช้ "โครงสร้าง" นี้หรือไม่: base, mantissa, exponent ดังนั้น 1/3 อาจเท่ากับ 3 ^ -1 {[11] = base 3, [1.0] mantissa, [-1] exponent} ความคิดอื่น ๆ ?

2
คำจำกัดความที่สร้างสรรค์มาตรฐานของจำนวนเต็ม rationals และ reals?
จำนวนธรรมชาติถูกกำหนด inductively เป็น (ใช้ไวยากรณ์ Coq เป็นตัวอย่าง) Inductive nat: Set := | O: nat | S: nat -> nat. มีวิธีมาตรฐานในการกำหนดจำนวนเต็ม (และชุดอื่น ๆ เช่น rationals และ reals) อย่างสร้างสรรค์?

1
เหตุใดความแม่นยำของโมดูลัสจุดลอยตัวจึงมีความสำคัญ
ภาษาถิ่น Smalltalk ส่วนใหญ่ใช้โมดูลัสลอยตัวแบบไร้เดียงสาที่ไร้เดียงสา (fmod / เศษที่เหลือ) ฉันเพิ่งเปลี่ยนสิ่งนี้เพื่อปรับปรุง Squeak / Pharo และท้ายที่สุดการยึดติดกับ Smalltalk อื่น ๆ ตามมาตรฐาน (IEEE 754, ISO / IEC 10967) ตามที่ฉันได้ทำไปแล้วสำหรับการดำเนินการจุดลอยตัวอื่น ๆ อย่างไรก็ตามสำหรับการยอมรับการเปลี่ยนแปลงเหล่านั้นฉันคาดหวังว่าการยึดมั่นในมาตรฐานจะไม่เพียงพอที่จะโน้มน้าวใจเพื่อน ๆ ของฉันดังนั้นการอธิบายว่าในสถานการณ์ใดความแม่นยำนี้สำคัญมากจะช่วยฉันได้มาก ฉันไม่สามารถหาตัวอย่างที่ดีได้ด้วยตัวเองจนถึงตอนนี้ มีใครที่นี่รู้หรือไม่ว่าทำไม / เมื่อ / ที่ไหน (IOW ซึ่งอัลกอริทึมใด) ความแม่นยำของโมดูลัสนั้นจะสำคัญหรือไม่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.