bc ต่างจาก dc อย่างไร


27

ความแตกต่างระหว่างdcและbcเครื่องคิดเลขคืออะไร?

ฉันควรใช้dcเมื่อใดและเมื่อbcใด


ฉันใช้exprบ่อยมากสำหรับการคำนวณอย่างง่าย ๆ บนบรรทัดคำสั่งและในสคริปต์
MattBianco

คำตอบ:


34

dcbcเป็นเครื่องมือที่เก่ามากและค่อนข้างเก่ากว่า หากต้องการอ้างอิงหน้า Wikipedia :

มันเป็นหนึ่งในยูทิลิตี้ที่เก่าแก่ที่สุดของระบบปฏิบัติการยูนิกซ์ที่มีมาก่อนแม้กระทั่งการประดิษฐ์ภาษาซี เช่นเดียวกับโปรแกรมอรรถประโยชน์อื่น ๆ ของเหล้าองุ่นนั้นมันมีชุดคุณสมบัติที่ทรงพลัง แต่มีไวยากรณ์ที่สั้นมาก

ไวยากรณ์เป็นสัญกรณ์ขัดกลับซึ่งโดยทั่วไปหมายความว่าข้อโต้แย้ง (เช่นตัวเลข) มาก่อนตามด้วยโอเปอเรเตอร์ ตัวอย่างพื้นฐานของการdcใช้งานคือ:

echo '3 4 * p' | dc

ตำแหน่งที่pจะต้องพิมพ์ผลลัพธ์ของการคำนวณ bcในทางตรงกันข้ามใช้สัญกรณ์มัดที่คุ้นเคยมากขึ้นและทำให้ง่ายต่อการใช้ นี่คือตัวอย่างbcการใช้งาน:

echo '3 * 4' | bc

จะใช้อันไหนดี?

bcเป็นมาตรฐานโดย POSIX และน่าจะเป็นแบบพกพาของทั้งสอง (อย่างน้อยในระบบที่ทันสมัย) หากคุณกำลังทำงานกับเครื่องคิดเลขด้วยตนเองมันเป็นทางเลือกที่แน่นอน (เว้นแต่คุณเป็นนักทำโทษตนเอง) dcยังสามารถใช้ประโยชน์ได้แม้ว่านี่เป็นกรณีที่สัญกรณ์ขัดกลับมีประโยชน์ ลองนึกภาพคุณมีโปรแกรมที่แสดงผลตัวเลขที่คุณต้องการรวมเช่น

23
7
90
74
29

ในการทำเช่นนี้dcทำได้ง่ายมาก (อย่างน้อยกับการใช้งานที่ทันสมัยซึ่งผู้ให้บริการแต่ละรายสามารถใช้ตัวเลขมากกว่าสองตัว) เนื่องจากคุณต้องต่อท้าย+pกระแสข้อมูลเช่น:

{ gen_nums; echo +p } | dc

แต่เนื่องจากbcมันมีความซับซ้อนมากขึ้นเนื่องจากเราไม่เพียง แต่ต้องใส่+ ระหว่างแต่ละหมายเลขและตรวจสอบให้แน่ใจว่าทุกอย่างอยู่ในบรรทัดเดียวกัน แต่ยังต้องแน่ใจว่ามีบรรทัดใหม่ในตอนท้าย:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

10
คุณได้เปิดตัวอย่างที่ซับซ้อนอย่างน่ากลัวโดยใช้gen_nums bcสามารถลดความซับซ้อนลงได้:gen_nums | paste -sd+ | bc
devnull

14
ความจริงแล้วสนุก: โดยปกติแล้วbcเป็นเพียงเครื่องมือส่วนหน้าที่รวบรวมbcสัญกรณ์กับสัญกรณ์dcและส่งไปdcยังเพื่อให้ได้ผลลัพธ์ บน FreeBSD ยังคงมีการ-cตั้งค่าสถานะbcซึ่งคุณยังสามารถรวบรวมdcสัญกรณ์. For example echo '3 * 4' | bc` echo '3 * 4' | bc -c | dcเท่ากับ ดูlinux.die.net/man/1/bcและfreebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens

14
อืมdcคุณกำลังใช้อะไรอยู่ บน Ubuntu 14.04 และ OS X +ผู้ปฏิบัติงานจะทำงานกับค่าสองค่าที่แน่นอนเสมอ
Digital Trauma

2
ตัวอย่างdcการใช้งานที่ถูกต้อง: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. สคริปต์นี้สำหรับdcอ่านและเพิ่มหมายเลขหนึ่งต่อหนึ่งในลูปแล้วพิมพ์ผลลัพธ์ ดูหมายเหตุเกี่ยวกับตัวเลขลบ
ruvim

1
@RaphaelAhrens สิ่งที่น่าสนใจบน macOS bc -cทำบางสิ่งที่แปลกและแตกต่าง (และไม่มีการ-cตั้งค่าสถานะธง) ถ้าฉันพยายามที่จะใส่เข้าไปdcฉันได้รับข้อผิดพลาดมากมาย (และผลลัพธ์ที่ไม่มีการไพพ์dcเป็นความลับ@iK3:K4:*W@r\n@i)
Konrad Rudolph

9

ความแตกต่างขั้นพื้นฐานระหว่างสองคือdcการนำมาใช้ประโยชน์โน้ตโปแลนด์ย้อนกลับ มันต้องมีคำสั่งที่ชัดเจนแม้ในการผลิตผลลัพธ์

คุณอาจเพิ่มจำนวนเต็มสองจำนวนbcโดยพูดว่า:

bc <<< "2+4"

และมันจะผลิต6บนบรรทัดด้วยตัวเอง อย่างไรก็ตามในที่dcคุณจะต้องพูดว่า:

dc <<< "2 4 +p"

คุณยังสามารถทำสิ่งที่สนุกมากโดยใช้dcเช่นดูคำตอบของฉันที่นี่เพื่อผลิต

Hello World!

dcการใช้

dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"


"Bc ถูกเขียนเป็น front-end ถึง Dc"
Adam

3

dcเป็นเครื่องคิดเลขในขณะที่bcเป็นภาษาจริง ดูหน้าคนของพวกเขา

กระแสตรง

dc เป็นเครื่องคิดเลขแบบตั้งโต๊ะขัดเงาซึ่งรองรับการคำนวณทางคณิตศาสตร์ที่มีความแม่นยำไม่ จำกัด นอกจากนี้ยังช่วยให้คุณกำหนดและเรียกแมโครได้ ปกติ dc อ่านจากอินพุตมาตรฐาน ถ้าอาร์กิวเมนต์คำสั่งใด ๆ ถูกกำหนดให้มันเป็นชื่อไฟล์และ dc อ่านและดำเนินการเนื้อหาของไฟล์ก่อนที่จะอ่านจากอินพุตมาตรฐาน เอาต์พุตปกติทั้งหมดคือเอาต์พุตมาตรฐาน เอาต์พุตข้อผิดพลาดทั้งหมดคือข้อผิดพลาดมาตรฐาน

ก่อนคริสต์ศักราช

bc เป็นภาษาที่รองรับตัวเลขที่มีความแม่นยำตามอำเภอใจพร้อมการประมวลผลข้อความ มีความคล้ายคลึงกันบางอย่างในไวยากรณ์กับภาษาการเขียนโปรแกรม C ไลบรารีคณิตศาสตร์มาตรฐานพร้อมใช้งานโดยตัวเลือกบรรทัดคำสั่ง หากมีการร้องขอไลบรารีคณิตศาสตร์จะถูกกำหนดก่อนประมวลผลไฟล์ใด ๆ bc เริ่มต้นด้วยการประมวลผลรหัสจากไฟล์ทั้งหมดที่ระบุไว้ในบรรทัดคำสั่งในลำดับที่ระบุไว้ หลังจากประมวลผลไฟล์ทั้งหมดแล้ว bc จะอ่านจากอินพุตมาตรฐาน รหัสทั้งหมดจะถูกดำเนินการตามที่อ่าน (หากไฟล์มีคำสั่งเพื่อหยุดการประมวลผล bc จะไม่อ่านจากอินพุตมาตรฐาน)

มันขึ้นอยู่กับสิ่งที่คุณต้องการทำในที่สุด dcการดำเนินงานบางอย่างจะไม่ไปได้โดยใช้ ฉันใช้ทั้งปีนอกเหนือจากเครื่องมือเครื่องคิดเลขบรรทัดคำสั่งอื่น ๆ ดู " ตัวแก้นิพจน์บรรทัดคำสั่ง? " สำหรับตัวอย่างเพิ่มเติม


3
@REACHUS - ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณถาม? เนื่องจากdcเป็นเครื่องคิดเลขสัญลักษณ์ขัดเงาย้อนกลับและเนื่องจากฉันเคยใช้เครื่องคิดเลขสัญกรณ์ขัดกลับ HP จริง ๆ แล้วฉันชอบที่dcจะใช้bcแต่ฉันจะบอกว่าทั้งคู่ยังคงใช้งานได้ทุกเมื่อที่คุณต้องทำการคำนวณทางคณิตศาสตร์ที่ซับซ้อน ฉันมักจะใช้พวกเขาเพื่อแปลงตัวเลข b / w ฐาน 10 เป็นฐาน 16 และฐาน 2 แต่ได้ใช้คอลัมน์เหล่านั้นนับเป็นคอลัมน์ในข้อมูลแบบตารางรวมทั้งจากภายในสคริปต์ AWK
slm

3
bcเป็นภาษาในแง่ที่ทำให้dcมนุษย์เป็นมิตร - ไม่ใช่ว่ามันมีพลังมากกว่า วันนี้แอพพลิเคแบ่งปัน libs แต่bcถูกเรียกว่าภาษาและเครื่องคิดเลขเพราะไม่คณิตศาสตร์และพูดคณิตศาสตร์ - เพื่อ นี่คือที่เก่ากว่าหน้า : ภาษาที่เรียกว่า[1] ได้รับการพัฒนาที่รับโปรแกรมที่เขียนในภาษาระดับสูงและรวบรวมผลผลิตซึ่งถูกตีความโดย DC คำสั่งบางคำอธิบายด้านล่างนี้ได้รับการออกแบบมาสำหรับอินเทอร์เฟซคอมไพเลอร์และไม่ใช่เรื่องง่ายที่ผู้ใช้จะจัดการ dcdcbcdcmanBC
mikeserv

2
ฉันอ้างว่าdcเป็นภาษา เช่นcodegolf.stackexchange.com/a/47921/11259
บาดเจ็บทางดิจิตอล

1
@DigitalTrauma เพื่อยืนยันว่ามันไม่ใช่ภาษาจะไร้สาระเนื่องจากมันมี lexer และ parser แต่จะเถียงว่ามันเป็นมนุษย์ที่อ่านได้ซึ่งเป็นตัวอย่างที่ไร้สาระ ฉันหมายถึง ...
คู่ปรับ Shot

1
@ParthianShot เห็นด้วย การอ่านของฉัน"dc เป็นเครื่องคิดเลขในขณะที่ bc เป็นภาษาจริง"คือ slm หมายถึงว่า dc ไม่ใช่ภาษาซึ่งฉันไม่เห็นด้วย แต่ฉันอาจจะอ่านคำตอบที่ผิด ...
27729 Digital บาดเจ็บแผล

0

ในความเห็นที่ต่ำต้อยของฉันและพูดให้น้อยที่สุด GNU dc นั้นแตกต่างจาก GNU bc ใน 3 วิธี:

1) ถ้าห้องสมุดคณิตศาสตร์ของ bc หมดความกังวลให้บันทึกการกดแป้นจำนวนมากที่สุดเท่าที่จะเป็นไปได้ (ในคำพูดของ Jan Łukasiewicz: สัญกรณ์ที่ไม่ต้องใช้วงเล็บ) เมื่อทำการคำนวณทางคณิตศาสตร์เบื้องต้นเพื่อสมาธิกับสิ่งจำเป็น

2) ในบรรทัดคำสั่งของ Microsoft Windows 7 GNU dc ใช้หน่วยความจำน้อยกว่า (~ 320K) กว่า GNU bc ทำ (~ 360K)

3) การควบคุมที่ละเอียดมากใน GNU dc มากกว่าใน GNU bc ตัวอย่างเช่นคำสั่ง stack และ register ไม่อยู่ใน GNU bc

รุ่น 1.07.1 win32 สำหรับทั้งคู่อยู่ที่https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

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