C ต้องคำนวณตัวเลขในสัญกรณ์วิทยาศาสตร์หรือไม่?

ค่าสูงสุดของทศนิยมคือ 3.40282347E+38 ซึ่งเทียบเท่ากับ 3.40282347 * 10^38 ฉันสงสัยว่าถ้าฉันตั้งค่าทศนิยมเท่ากับสิ่งนี้ มันต้องยกกำลังและการคูณจริง ๆ เพื่อให้ได้ค่าที่จะเก็บ หรือสัญกรณ์ทางวิทยาศาสตร์เป็นเพียงค่าจริงหรือไม่

ฉันกำลังเขียนโครงการของโรงเรียนซึ่งเรากำลังเพิ่มประสิทธิภาพให้ดีที่สุดเท่าที่จะทำได้ ดังนั้นสิ่งนี้จึงเกี่ยวข้องกับฉัน โดยเฉพาะอย่างยิ่งเนื่องจากมันอยู่ภายในโครงสร้างลูปที่ซ้อนกัน


person FLOWMEEN    schedule 12.04.2016    source แหล่งที่มา
comment
ค่าคงที่ตามตัวอักษรเช่นนี้จะได้รับการประเมิน ณ เวลาคอมไพล์ ไม่ใช่รันไทม์ นอกจากนี้ ให้ใช้ FLT_MAX แทนค่าคงที่แบบฮาร์ดโค้ด   -  person Paul R    schedule 12.04.2016
comment
โอเค ดีใจที่ได้รู้ ฉันไม่ได้รับอนุญาตให้รวมส่วนหัว float.h ดังนั้นฉันจึงใช้ FLT_MAX ไม่ได้   -  person FLOWMEEN    schedule 12.04.2016
comment
สิ่งนี้อาจช่วยได้เช่นกัน: stackoverflow.com/questions/3271588/   -  person RhinoDevel    schedule 12.04.2016
comment
ไม่สามารถรวม float.h... กฎแปลก ๆ สำหรับการบ้านเหล่านี้ทำให้ฉันตั้งคำถามถึงการศึกษาที่เกิดขึ้นในบางครั้ง... ฉันเข้าใจได้ว่าการบอกคนอื่นว่าอย่ารวม <unordered_map> ถ้าการบ้านคือการใช้ตารางแฮช แต่นี่เป็นเรื่องไร้สาระ   -  person Dietrich Epp    schedule 12.04.2016
comment
@DietrichEpp ฉันเดาว่ากฎที่แปลกประหลาดบางอย่างมีจุดประสงค์เพื่อป้องกันการใช้ซอฟต์แวร์ที่ดาวน์โหลดโดยตรงเป็นคำตอบการบ้าน   -  person Patricia Shanahan    schedule 12.04.2016


คำตอบ (3)


เมื่อคุณใช้ตัวอักษรในซอร์สโค้ดของคุณ ตัวอักษรเหล่านั้น (และส่วนใหญ่เป็นนิพจน์ที่มีตัวอักษรทั้งหมดสำหรับการพับคงที่) จะถูกประเมินในเวลาคอมไพล์และแปลงเป็นคำสั่งเช่น move immediate, add immediate, move special_constant_register เป็นต้น

เช่น:

int a = 10, b = 0xA;

ที่นี่ทั้งตัวอักษร 10 และ 0xA ได้รับการประเมินให้เป็นค่าเดียวกัน ณ เวลารวบรวม ในกรณีของคุณ double ตัวอักษรหรือ float ตัวอักษรจะถูกประเมิน ณ เวลาคอมไพล์ และค่าที่เหมาะสมที่สุดจะถูกกำหนดให้กับตัวแปร

person Mohit Jain    schedule 12.04.2016

เมื่อคุณเขียน 3.4e38 มันจะถูกประเมินอย่างสมบูรณ์ ณ เวลาคอมไพล์

เมื่อคุณเขียน 3.4 * 10^38 คุณจะได้รับผลลัพธ์ที่ไม่คาดคิดโดยสิ้นเชิง เนื่องจาก ^ ไม่ได้หมายถึงกำลังของในภาษา C แต่หมายถึง "เฉพาะหรือ" และ 10 ^ 38 == 44 หรืออาจจะไม่คอมไพล์เลย เนื่องจากได้รับการประเมินเป็น (3.4 * 10) ^ 38 และ xor ไม่ได้ถูกกำหนดไว้สำหรับจุดลอยตัว หรือถูกกำหนดไว้แล้ว มันจะเป็น 340 ^ 10

person Roland Illig    schedule 12.04.2016
comment
ขอบคุณ นั่นเป็นเพียงรหัสเทียม ฉันหมายถึง 3.40282347 * pow(10, 38) - person FLOWMEEN; 12.04.2016

ทั้งหมดนี้เสร็จสิ้นในเวลารวบรวม รหัสต่อไปนี้...

#include <float.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  float foo = 3.40282347E+38;
  float bar = 3.40282347e38;
  printf("foo=%g\nbar=%g\n", foo, bar);
  return 0;
}

สร้างสิ่งนี้ในแอสเซมเบลอร์ ในการรับแอสเซมเบลอร์ให้ใช้แฟล็ก -S เพื่อ gcc เช่น

gcc -S -Wall -O3 -pedantic -std=c11 scientific_notation.c 

นี่คือการใช้เสียงดังกราว ฉันจะตัดการประกอบเล็กน้อย ...

 .section  __TEXT,__text,regular,pure_instructions
  .macosx_version_min 10, 11
  .section  __TEXT,__literal8,8byte_literals
  .align  3
LCPI0_0:
  .quad 5183643170566569984     ## double 3.4028234663852886E+38
  .section  __TEXT,__text,regular,pure_instructions
  .globl  _main
  .align  4, 0x90

...ตัดภาพ

สังเกตบรรทัดนี้ .quad 5183643170566569984 มันเป็นค่าคงที่ โปรดทราบด้วยว่าแม้ว่าฉันจะมีค่าคงที่สองตัวในโค้ดของฉันก็ต้องใช้เพียงค่าเดียวเท่านั้นโดยคอมไพเลอร์

person Harry    schedule 12.04.2016