繁体   English   中英

C是否必须用科学计数法计算出一个数字?

[英]Does C have to calculate out a number in scientific notation?

浮点数的最大值是3.40282347E + 38。 这相当于3.40282347 * 10 ^ 38。 我想知道我是否设置了一个与此相等的浮点数,它是否必须实际执行幂和乘法才能得到存储的值,或者科学记数法只是实际值?

我正在编写一个我们正在优化的学校项目,所以这对我来说很重要,特别是因为它在嵌套的循环结构中。

当您在源代码中使用文字时,这些文字(以及主要用于常量折叠的所有文字的表达式)在编译时进行评估,并转换为move immediate add immediatemove special_constant_register等指令。

例如:

int a = 10, b = 0xA;

这里, 100xA文字在编译时被计算为相同的值。 在您的情况下,也会在编译时评估double literal或float literal,并为该变量分配最合适的值。

当你编写3.4e38 ,它会在编译时完全评估。

当你写3.4 * 10^38 ,你会得到一个完全出乎意料的结果。 这是因为^并不意味着C中的幂。它意味着“异或”,并且10 ^ 38 == 44 或者它可能根本不编译,因为它被评估为(3.4 * 10) ^ 38 ,并且没有为浮点定义xor。 或者它被定义,所以它将是340 ^ 10

这一切都是在编译时完成的。 以下代码......

#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 

这是使用clang。 我会稍微剪掉汇编程序......

 .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 这是一个常数。 另请注意,即使我的代码中有两个这样的常量,编译器也只需要一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM