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

แท็กนี้มีไว้สำหรับทุกสิ่งที่เกี่ยวข้องกับการดำเนินการทางคณิตศาสตร์ ดังนั้นหากคุณต้องการถามคำถามเกี่ยวกับการคำนวณในʻawk` หรือหากคุณมีคำถามเกี่ยวกับ "bc" นี่คือแท็กที่เหมาะสมที่จะใช้

1
ผลกระทบด้านความปลอดภัยของการใช้ข้อมูลที่ไม่ได้รับอนุญาตในการประเมินผลการคำนวณทางคณิตศาสตร์ของเชลล์
ในความคิดเห็นต่อคำถามล่าสุด Stéphane Chazelas กล่าวว่ามีผลกระทบด้านความปลอดภัยต่อวงเล็บทางคณิตศาสตร์สองหลักเช่น: x=$((1-$x)) บนเปลือกหอยส่วนใหญ่ ทักษะ Google ของฉันดูเหมือนจะเป็นสนิมและฉันไม่พบสิ่งใดเลย ผลกระทบด้านความปลอดภัยของเลขคณิตวงเล็บคู่คืออะไร?


4
การเลื่อนระดับบิตและจำนวนเต็มที่ใหญ่ที่สุดใน Bash
นี่เป็นคำถามสำรวจซึ่งหมายความว่าฉันไม่แน่ใจว่าคำถามนี้เกี่ยวข้องกับอะไร แต่ฉันคิดว่ามันเป็นจำนวนเต็มที่ใหญ่ที่สุดใน Bash อย่างไรก็ตามฉันจะนิยามมันอย่างชัดแจ้ง $ echo $((1<<8)) 256 ฉันกำลังผลิตจำนวนเต็มโดยขยับบิต ฉันจะไปได้ไกลแค่ไหน? $ echo $((1<<80000)) 1 ไม่ไกลขนาดนี้ (1 คาดไม่ถึงและฉันจะกลับไปหามัน) แต่ $ echo $((1<<1022)) 4611686018427387904 ยังคงเป็นบวก อย่างไรก็ตามไม่ใช่: $ echo $((1<<1023)) -9223372036854775808 และก้าวไปอีกขั้นหนึ่ง $ echo $((1<<1024)) 1 ทำไมต้อง 1 และทำไมต่อไปนี้? $ echo $((1<<1025)) 2 $ echo $((1<<1026)) 4 มีคนต้องการวิเคราะห์ซีรี่ส์นี้หรือไม่ UPDATE เครื่องของฉัน: $ uname -a …
16 bash  arithmetic 

2
วิธีการเพิ่มตัวแปรท้องถิ่นใน Bash
ข้อมูล 1 \begin{document} 3 รหัส #!/bin/bash function getStart { local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)" echo $START } START2=$(getStart) echo $START2 ซึ่งผลตอบแทนแต่ฉันต้องการ2 3ฉันเปลี่ยนปลายไม่สำเร็จโดยคำตอบนี้เกี่ยวกับฉันจะเพิ่มตัวเลขในสคริปต์ทุบตี : START2=$((getStart+1)) คุณจะเพิ่มตัวแปรโลคอลในสคริปต์ Bash ได้อย่างไร?

6
ทำไม“ $ ((~ 33))” ถึง -34
$ echo $(( 255 )) 255 $ echo $(( 33 )) 33 $ echo $(( ~33 )) -34 $ echo $(( ~255 )) -256 $ และเคอร์เนลของฉันคือ: $ uname -a Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux คำถาม: ใช้ ~สำหรับลบหมายเลข AFAIK แต่ทำไมต้อง~33ผลิต-34และทำไมจะ~255ผลิต-256?
12 bash  shell  arithmetic 

8
วิธีการรวมเวลาโดยใช้ทุบตี?
ฉันต้องการทราบจำนวนเวลาทั้งหมดที่กระบวนการต่างๆใช้ในคอมพิวเตอร์ของฉันในการตัดสินใจว่าฉันควรรันที่นั่นหรือในคอมพิวเตอร์ที่แรงกว่า ดังนั้นฉันคาดการณ์เวลาทำงานของแต่ละคำสั่ง ผลลัพธ์ดูเหมือนว่า: process1 00:03:34 process2 00:00:35 process3 00:12:34 ฉันจะรวมคอลัมน์ที่สองเพื่อรับเวลาทำงานทั้งหมดได้อย่างไร ฉันลอง pipping แต่ละบรรทัดผ่าน awk '{sum += $2 } END { print sum } แต่สิ่งนี้ไม่สมเหตุสมผลเนื่องจากค่าไม่ใช่ตัวเลขตามธรรมชาติ
12 bash  time  arithmetic 

2
awk เลขคณิตความแม่นยำสูง
ฉันกำลังมองหาวิธีที่จะบอก awk ให้ทำเลขคณิตความแม่นยำสูงในการดำเนินการทดแทน สิ่งนี้เกี่ยวข้องกับการอ่านฟิลด์จากไฟล์และแทนที่ด้วยการเพิ่มค่า 1% อย่างไรก็ตามฉันสูญเสียความแม่นยำที่นั่น นี่คือการทำสำเนาของปัญหาที่ง่ายขึ้น: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}' 0.546748 ที่นี่ฉันมี 16 หลักหลังจากความแม่นยำทศนิยม แต่ awk ให้เพียงหก เมื่อใช้ printf ฉันจะได้ผลลัพธ์เดียวกัน: $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}' 0.546748 ข้อเสนอแนะเกี่ยวกับวิธีการได้รับความแม่นยำที่ต้องการ?

4
คำนวณตัวแปรและส่งออกไปยังตัวแปรอื่น
bcเครื่องคิดเลขเดียวที่ผมรู้ก็คือ ฉันต้องการเพิ่ม1ตัวแปรและส่งออกไปยังตัวแปรอื่น ฉันได้รับnextnumตัวแปรจากการนับสตริงในไฟล์: nextnum=`grep -o stringtocount file.tpl.php | wc -w` ช่วยบอกว่าค่าnextnum 1เมื่อเพิ่มเข้ามาด้วยก็จะกลายเป็น1 2ในการคำนวณฉันทำงาน: rownum=`$nextnum+1 | bc` แต่มีข้อผิดพลาด: 1+1: command not found ฉันเพิ่งล้มเหลวในส่วนการคำนวณ ฉันลองเปลี่ยน backtick แล้วแต่ยังใช้งานไม่ได้ ฉันไม่ทราบวิธีการคำนวณตัวแปรและส่งออกไปยังตัวแปรอื่น

1
เหตุผลสำหรับเปลือกทุบตีไม่เตือนคุณเกี่ยวกับการคำนวณทางคณิตศาสตร์ล้น ฯลฯ คืออะไร?
มีขีด จำกัด สำหรับความสามารถในการประเมินผลทางคณิตศาสตร์ของbashเชลล์ คู่มือฉบับย่อเกี่ยวกับแง่มุมของเชลล์ทางคณิตศาสตร์นี้ แต่ระบุว่า : การประเมินจะทำในจำนวนเต็มที่มีความกว้างคงที่โดยไม่มีการตรวจสอบการล้น แต่การหารด้วย 0 จะถูกดักและตั้งค่าสถานะเป็นข้อผิดพลาด โอเปอเรเตอร์และลำดับความสำคัญการเชื่อมโยงและค่าต่าง ๆ นั้นเหมือนกับในภาษา C จำนวนเต็มที่มีความกว้างคงที่ซึ่งหมายถึงนี้เป็นจริงเกี่ยวกับชนิดข้อมูลที่ใช้ (และเฉพาะของสาเหตุนี้เกินกว่านี้) แต่ค่าขีด จำกัด จะแสดง/usr/include/limits.hในแบบนี้: # if __WORDSIZE == 64 # define ULONG_MAX 18446744073709551615UL # ifdef __USE_ISOC99 # define LLONG_MAX 9223372036854775807LL # define ULLONG_MAX 18446744073709551615ULL และเมื่อคุณรู้ว่าคุณสามารถยืนยันสถานะของความจริงเช่นนี้: # getconf -a | grep 'long' LONG_BIT 64 ULONG_MAX 18446744073709551615 …

3
case + วิธีใช้งานเท่ากันหรือน้อยกว่าหรือน้อยกว่า
เป้าหมายของฉันคือการตรวจสอบช่วงของตัวเลขด้วย (เฉพาะกับcase+ esac) และพิมพ์ช่วง ตัวอย่างเช่น: หากตัวเลขอยู่ระหว่าง 0 ถึง 80 ให้พิมพ์ >=0<=80 หากตัวเลขอยู่ระหว่าง 81 ถึง 100 ให้พิมพ์ >=81<=100 เป็นต้น ปัญหาเกี่ยวกับสคริปต์ของฉันด้านล่างพิมพ์เฉพาะใน>=0<=90กรณีที่หมายเลขระหว่าง 0 ถึง 9 วิธีการแก้ไขสคริปต์ของฉันเพื่อที่จะพิมพ์ผลลัพธ์ที่ถูกต้องตามช่วงหมายเลข? #!/bin/ksh read number case $number in [0-80]) echo ">=0<=80";; [81-100]) echo ">=81<=100";; [101-120]) echo ">=101<=120";; [121-300]) echo ">=121<=300";; esac
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.