bc ไม่รองรับการบันทึกและการคำนวณแบบแฟคทอเรียล?


17

มีเครื่องคิดเลขคำสั่งอื่น ๆ สายที่สนับสนุนlog, n!การคำนวณ? อย่างน้อยbcก็ไม่สามารถทำเช่นนั้นได้

จะดีที่สุดถ้าฉันสามารถใช้สคริปต์เช่น echo '5!' | program

คำตอบ:


20

bcรองรับลอการิทึมธรรมชาติหากเรียกใช้ด้วย-lแฟล็ก คุณสามารถคำนวณบันทึกฐาน 10 หรือฐาน 2 ได้:

$ bc -l
...
l(100)/l(10)
2.00000000000000000000

l(256)/l(2)
8.00000000000000000007

ฉันไม่คิดว่าจะมีแฟกทอเรียลในตัว แต่ก็ง่ายพอที่จะเขียนเอง:

$ bc
...
define fact_rec (n) { 
  if (n < 0) {
    print "oops";
    halt;
  }
  if (n < 2) return 1;
  return n*fact_rec(n-1);
}
fact_rec(5)
120

หรือ:

define fact_it (n) {
  if (n < 0) {
    print "oops";
    halt;
  }
  res = 1;
  for (; n > 1; n--) {
    res *= n;
  }
  return res;
}
fact_it(100)
93326215443944152681699238856266700490715968264381621468592963895217\
59999322991560894146397615651828625369792082722375825118521091686400\
0000000000000000000000

เพื่อให้เป็นไปตาม POSIX คุณต้องเขียน:

define f(n) {
  auto s, m
  if (n <= 0) {
    "Invalid input: "
    n
    return(-1)
  }
  s = scale
  scale = 0
  m = n / 1
  scale = s
  if (n != m) {
    "Invalid input: "
    n
    return(-1)
  }
  if (n < 2) return(1)
  return(n * f(n - 1))
}

นั่นคือ: ตัวเดียวชื่อฟังก์ชันไม่มีprintไม่มีวงเล็บที่จำเป็นในการhalt return(x)หากคุณไม่ต้องการการตรวจสอบความถูกต้องของอินพุต (นี่คือตัวเลขจำนวนเต็มบวก) เพียง:

define f(n) {
  if (n < 2) return(1)
  return(n * f(n - 1))
}

1
กำลังตรวจสอบว่า n == 1 ส่งผลให้วนซ้ำไม่รู้จบถ้าคุณให้จำนวนลบหรือศูนย์ ใช้ n <= 1 แทนเหมือนในหน้า bc แม้ว่าจริง ๆ แล้วมันควรกลับข้อผิดพลาดของตัวเลขลบ - ตามen.wikipedia.org/wiki/ …นี่เป็นปัญหาที่ทราบกันดีว่าการใช้การเรียกซ้ำเพื่อคำนวณแฟคทอเรียล
CAS

นี่ไม่ได้หมายถึงการศึกษาในการใช้แฟคทอเรียลที่สมบูรณ์แบบเพียงแค่การสาธิตอย่างง่าย ๆ เพื่อแสดงว่า bc มีฟังก์ชั่นรวมถึงฟังก์ชั่นวนซ้ำ
Mat

จริง แต่สักวันจะมีคนอ่านฟังก์ชั่นตัวอย่างและพูดว่า "เยี่ยมมากฉันสงสัยว่าจะทำยังไง" และใช้มัน BTW ผมเรื่องที่ไกลจากการเป็นคณิตศาสตร์ geek เท่าที่คุณสามารถและยังคงเป็นคอมพิวเตอร์ geek ... แต่ตั้งแต่ผมได้รับการแก้ไขข้อผิดพลาดที่ฉันคิดว่าฉันควรที่จะทำวิจัยน้อยแรก :)
CAS

ตกลงคุณไป ที่ถูกต้องและรุ่นเวียนเกิดซ้ำแล้วซ้ำอีก ...
จ้า

ไม่ได้ค่อนข้างถูกต้อง: เช่นเดียวกับที่0!=1 1!=1อย่างน้อยนั่นคือสิ่งที่ wikipedia พูด
cas

4

Orpieเป็นเครื่องคิดเลขสำหรับเครื่องคิดเลขและคำสั่ง geeks บรรทัด มันจำลองเครื่องคิดเลข HP RPN ที่ทันสมัยซึ่งเป็นวิธีเดียวที่แท้จริงในการคำนวณ

หากคุณเป็นคนนอกรีตเครื่องคิดเลขยกมาจาก TIs, Casios และมีบทเรียนRPN มากมาย ออนไลน์ที่คุณสามารถเริ่มการศึกษาใหม่ได้ คู่มือ Orpieในที่สุดจะมีประโยชน์กับคุณเมื่อคุณได้รับวิธีคิด RPN

เพื่อคำนวณ 5! ใน Orpie 5 !เพียงพิมพ์ได้ตามที่คุณต้องการเขียน: คุณสามารถกดEnterระหว่างสองอันเพื่อกด5ลงบนสแต็กก่อนได้ แต่ไม่จำเป็น

ในการคำนวณล็อก10 (5) ให้พิมพ์5 Enter ' l o Enterชนิด คุณต้องกด5ลงบนสแต็กก่อนในกรณีนี้เนื่องจากการกดแป้นถัดไปไม่ใช่ตัวดำเนินการ อักขระเครื่องหมายคำพูดเดี่ยวนั้นเข้าสู่โหมดตัวย่อของคำสั่งซึ่งช่วยให้คุณเริ่มพิมพ์log10ซึ่งคุณสามารถระบุด้วยอักขระสองตัวแรกเท่านั้น ( lเพียงอย่างเดียวทำให้คุณได้รับฟังก์ชั่นบันทึกธรรมชาติlnแทน)

เช่นเดียวกับเครื่องคิดเลข RPN ใด ๆ ที่คุณจะได้รับมันได้อย่างรวดเร็วด้วย Orpie กับบิตของการปฏิบัติ

Orpie อยู่ใน repos ของ Ubuntu FreeBSD math/orpieรวมไว้ในพอร์ตเป็น บน OS X คุณสามารถติดตั้งผ่าน Homebrew อาจมีแพ็คเกจของบุคคลที่สามสำหรับ OS อื่น ๆ การสร้างจากแหล่งที่มาอาจเป็นเรื่องน่าเบื่อเนื่องจากเขียนในOCamlและคุณอาจไม่ได้ติดตั้งสภาพแวดล้อมการพัฒนา OCaml ไว้ แม้ว่าการติดตั้งครั้งเดียวจะไม่ยากอย่างยิ่ง


2

มี GNU เสมอ Octaveเครื่องคิดเลขบรรทัดคำสั่ง (สำหรับเมื่อคุณต้องการสภาพแวดล้อมการพัฒนาที่สมบูรณ์และภาษาการเขียนโปรแกรมในเครื่องคิดเลขของคุณและโปรแกรมเสริมเพิ่มเติมนับพัน)

หรือ Rถ้าสถิติของคุณมากกว่าสิ่งที่คุณ

ฉันส่วนใหญ่ใช้bc -lเพื่อโหลดไลบรารีคณิตศาสตร์มาตรฐานเท่านั้น ... ฉันยังมีbcนามแฝงbc -lอยู่ ดูคำตอบของ Mat สำหรับข้อมูลเกี่ยวกับการกำหนดฟังก์ชันแฟกทอเรียล .... แม้ว่าbcหน้า man จะกำหนดเป็น:

define f (x) {
  if (x <= 1) return (1);
  return (f(x-1) * x);
}

การตรวจสอบ <= 1 แทน == 1 จะป้องกันการวนซ้ำไม่รู้จบหากคุณป้อนข้อมูลเป็นจำนวนลบ (ควรเป็นข้อผิดพลาด) หรือเป็นศูนย์ (ถูกต้อง)


1

W-Calcที่ฉันชอบคือมีน้ำหนักเบาง่าย http://w-calc.sourceforge.net

คุณไม่ต้องมองหาคู่มือทั่วไปหรือสร้างฟังก์ชั่นทั่วไปขึ้นมาใหม่เหมือนที่คุณทำด้วยตนเองbc- คำสั่งส่วนใหญ่เป็นสิ่งที่คุณคาดหวังดังนั้นเพียงพิมพ์สิ่งที่คุณต้องการและใช้งานได้ การทดสอบตามคำถามของคุณ - แน่นอนlog()& n!ทำงานตามที่คาดไว้

(เป็นที่ยอมรับฉันไม่เคยได้ยิน Orpie - ดีมากอาจเป็นตัวเลือกที่ดีกว่า)


0

เกินความจริงโดยสิ้นเชิง แต่ล่ามภาษาการเขียนโปรแกรมเป็นเครื่องคิดเลขบรรทัดคำสั่งหลังจากทั้งหมด:

$ echo 5 | python -c 'import sys; import math; print math.factorial(int(sys.stdin.readline()));'
120

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