Apakah C harus menghitung bilangan dalam notasi ilmiah?

Nilai maksimal float adalah 3,40282347E+38. Ini setara dengan 3,40282347 * 10^38. Saya bertanya-tanya apakah saya menetapkan float sama dengan ini, apakah ia harus benar-benar melakukan pangkat dan perkalian untuk menyimpan nilai, atau apakah notasi ilmiah hanyalah nilai sebenarnya?

Saya sedang menulis proyek sekolah yang kami optimalkan sebaik mungkin, jadi ini relevan bagi saya, terutama karena ini berada dalam struktur loop bersarang.


person FLOWMEEN    schedule 12.04.2016    source sumber
comment
Konstanta literal seperti ini dievaluasi pada waktu kompilasi, bukan waktu proses. Selain itu, gunakan FLT_MAX daripada konstanta hard-coded.   -  person Paul R    schedule 12.04.2016
comment
oke, senang mengetahuinya. saya tidak diperbolehkan memasukkan header float.h, jadi saya tidak bisa menggunakan FLT_MAX   -  person FLOWMEEN    schedule 12.04.2016
comment
Ini mungkin juga membantu: stackoverflow.com/questions/3271588/   -  person RhinoDevel    schedule 12.04.2016
comment
Tidak dapat menyertakan float.h... peraturan aneh untuk pekerjaan rumah ini terkadang membuat saya mempertanyakan pendidikan yang sedang berlangsung... Saya dapat memahami bahwa menyuruh orang untuk tidak menyertakan <unordered_map> jika tugasnya adalah menerapkan tabel hash, tetapi ini konyol.   -  person Dietrich Epp    schedule 12.04.2016
comment
@DietrichEpp Dugaan saya adalah bahwa beberapa aturan yang lebih aneh dimaksudkan untuk mencegah penggunaan langsung perangkat lunak yang diunduh sebagai jawaban pekerjaan rumah.   -  person Patricia Shanahan    schedule 12.04.2016


Jawaban (3)


Saat Anda menggunakan literal dalam kode sumber Anda, literal tersebut (dan sebagian besar ekspresi berisi semua literal untuk pelipatan konstan) dievaluasi pada waktu kompilasi dan dikonversi ke instruksi seperti move immediate, add immediate, move special_constant_register dll.

Misalnya:

int a = 10, b = 0xA;

Di sini literal 10 dan 0xA dievaluasi dengan nilai yang sama pada waktu kompilasi. Dalam kasus Anda juga, double literal atau float literal akan dievaluasi pada waktu kompilasi dan nilai yang paling sesuai akan diberikan ke variabel.

person Mohit Jain    schedule 12.04.2016

Saat Anda menulis 3.4e38, itu dievaluasi sepenuhnya pada waktu kompilasi.

Saat Anda menulis 3.4 * 10^38, Anda mendapatkan hasil yang sama sekali tidak terduga. Ini karena ^ tidak berarti power-of dalam C. Artinya “eksklusif atau”, dan 10 ^ 38 == 44. Atau mungkin tidak dapat dikompilasi sama sekali karena dievaluasi sebagai (3.4 * 10) ^ 38 dan xor tidak ditentukan untuk floating point. Atau sudah ditentukan, jadi 340 ^ 10.

person Roland Illig    schedule 12.04.2016
comment
terima kasih, itu hanya kodesemu. Maksudku 3.40282347 * daya(10, 38) - person FLOWMEEN; 12.04.2016

Itu semua dilakukan pada waktu kompilasi. Kode berikut...

#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;
}

Menghasilkan ini di assembler. Untuk mendapatkan assembler gunakan flag -S ke gcc yaitu, kira-kira

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

Ini menggunakan dentang. Saya akan memotong assemblernya sedikit...

 .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

... terpotong.

Perhatikan baris ini .quad 5183643170566569984. Itu adalah sebuah konstanta. Perhatikan juga bahwa meskipun saya memiliki dua konstanta ini dalam kode saya, hanya satu yang dibutuhkan oleh kompiler.

person Harry    schedule 12.04.2016