C语言中浮点数定义和文本处理的配合

零、C语言中float类型变量定义的诡异性

在C语言中,float类型的定义比较特殊,特别是对于小数点左右侧数字的定义看起来也比较诡异:例如这种".005","10."等类型,问题是这种节省一个数字0,让浮点数看起来非常诡异的意义在哪里?不是不允许这种奇形怪状的定义,让浮点数看起来更加规范它不香吗?
最近在处理大量浮点数的时候发现这种定义的一个很好的应用,才发现允许这种定义可能是真香。

一、C语言中float类型变量的定义

floating-constant:
decimal-floating-constant
decimal-floating-constant:
fractional-constant exponent-part(opt) floating-suffix(opt)
digit-sequence exponent-part floating-suffix(opt)
fractional-constant:
digit-sequence(opt) . digit-sequence
digit-sequence .
exponent-part:
e sign(opt) digit-sequence
E sign(opt) digit-sequence
sign: one of
+ -
digit-sequence:
digit
digit-sequence digit
floating-suffix: one of
f l F L
这意味这"0."、".0"、"0.0"都是合法浮点数,但是"."并不是合法浮点数定义。

二、在大量浮点数处理中的一个应用

假设说对于一些输入文本中包含了大量的浮点数,想要把它们全部放大或者缩小10倍或者100倍,则可以通过简单的正则表达式来实现(当然由于是字面常量,直接替换为 x*10之类完成)。

1、将所有浮点数放大100倍

tsecer@harry: cat input.txt.amp
200.000 37.932 -39.990 200.000 37.932 -79.985 200.000 37.932 -79.987 -200.000

37.932 -79.980 -200.000 57.932 -79.980 200.000 57.932 -119.976 200.000 57.933

-119.977 -200.000 57.933 -119.971 -200.000 77.933 -119.971 200.000 77.933 -159.964

200.000 77.936 -159.966 -200.000 77.935 -159.958 -200.000 97.940 -159.958 200.000

97.940 -199.958 -200.000 97.940 -199.958 200.000 97.940 -159.964 200.000 -2.068

-199.958 200.000 -2.068 -39.995 200.000 -2.068 -79.985 200.000 -2.068 -119.976

200.000 -2.068 -159.964 -200.000 -2.068 -199.958 -200.000 -2.068 -39.995 -200.000

tsecer@harry: for (( i =0; i < 2; i++)) do sed -i -e 's/([[:digit:]]).([[:digit:]])/12./g' input.txt.amp ; done
tsecer@harry: cat input.txt.amp
20000.0 3793.2 -3999.0 20000.0 3793.2 -7998.5 20000.0 3793.2 -7998.7 -20000.0

3793.2 -7998.0 -20000.0 5793.2 -7998.0 20000.0 5793.2 -11997.6 20000.0 5793.3

-11997.7 -20000.0 5793.3 -11997.1 -20000.0 7793.3 -11997.1 20000.0 7793.3 -15996.4

20000.0 7793.6 -15996.6 -20000.0 7793.5 -15995.8 -20000.0 9794.0 -15995.8 20000.0

9794.0 -19995.8 -20000.0 9794.0 -19995.8 20000.0 9794.0 -15996.4 20000.0 -206.8

-19995.8 20000.0 -206.8 -3999.5 20000.0 -206.8 -7998.5 20000.0 -206.8 -11997.6

20000.0 -206.8 -15996.4 -20000.0 -206.8 -19995.8 -20000.0 -206.8 -3999.5 -20000.0

tsecer@harry:

2、将所有浮点缩小10倍

tsecer@harry: cat input.txt.sim
200.000 37.932 -39.990 200.000 37.932 -79.985 200.000 37.932 -79.987 -200.000

37.932 -79.980 -200.000 57.932 -79.980 200.000 57.932 -119.976 200.000 57.933

-119.977 -200.000 57.933 -119.971 -200.000 77.933 -119.971 200.000 77.933 -159.964

200.000 77.936 -159.966 -200.000 77.935 -159.958 -200.000 97.940 -159.958 200.000

97.940 -199.958 -200.000 97.940 -199.958 200.000 97.940 -159.964 200.000 -2.068

-199.958 200.000 -2.068 -39.995 200.000 -2.068 -79.985 200.000 -2.068 -119.976

200.000 -2.068 -159.964 -200.000 -2.068 -199.958 -200.000 -2.068 -39.995 -200.000

tsecer@harry: sed -e 's/([[:digit:]]).([[:digit:]])/.12/g' input.txt.sim
20.0000 3.7932 -3.9990 20.0000 3.7932 -7.9985 20.0000 3.7932 -7.9987 -20.0000

3.7932 -7.9980 -20.0000 5.7932 -7.9980 20.0000 5.7932 -11.9976 20.0000 5.7933

-11.9977 -20.0000 5.7933 -11.9971 -20.0000 7.7933 -11.9971 20.0000 7.7933 -15.9964

20.0000 7.7936 -15.9966 -20.0000 7.7935 -15.9958 -20.0000 9.7940 -15.9958 20.0000

9.7940 -19.9958 -20.0000 9.7940 -19.9958 20.0000 9.7940 -15.9964 20.0000 -.2068

-19.9958 20.0000 -.2068 -3.9995 20.0000 -.2068 -7.9985 20.0000 -.2068 -11.9976

20.0000 -.2068 -15.9964 -20.0000 -.2068 -19.9958 -20.0000 -.2068 -3.9995 -20.0000

tsecer@harry:

3、编译常量

当然最通用的方法还是使用C的编译常量,直接为每个数乘以放大/缩小倍数。

tsecer@harry: cat input.txt.sim
200.000 37.932 -39.990 200.000 37.932 -79.985 200.000 37.932 -79.987 -200.000

37.932 -79.980 -200.000 57.932 -79.980 200.000 57.932 -119.976 200.000 57.933

-119.977 -200.000 57.933 -119.971 -200.000 77.933 -119.971 200.000 77.933 -159.964

200.000 77.936 -159.966 -200.000 77.935 -159.958 -200.000 97.940 -159.958 200.000

97.940 -199.958 -200.000 97.940 -199.958 200.000 97.940 -159.964 200.000 -2.068

-199.958 200.000 -2.068 -39.995 200.000 -2.068 -79.985 200.000 -2.068 -119.976

200.000 -2.068 -159.964 -200.000 -2.068 -199.958 -200.000 -2.068 -39.995 -200.000

tsecer@harry: sed -e 's/([[:digit:]]+.[[:digit:]]+)/1*0.001f/g' input.txt.sim
200.000*0.001f 37.932*0.001f -39.990*0.001f 200.000*0.001f 37.932*0.001f -79.985*0.001f 200.000*0.001f 37.932*0.001f -79.987*0.001f -200.000*0.001f

37.932*0.001f -79.980*0.001f -200.000*0.001f 57.932*0.001f -79.980*0.001f 200.000*0.001f 57.932*0.001f -119.976*0.001f 200.000*0.001f 57.933*0.001f

-119.977*0.001f -200.000*0.001f 57.933*0.001f -119.971*0.001f -200.000*0.001f 77.933*0.001f -119.971*0.001f 200.000*0.001f 77.933*0.001f -159.964*0.001f

200.000*0.001f 77.936*0.001f -159.966*0.001f -200.000*0.001f 77.935*0.001f -159.958*0.001f -200.000*0.001f 97.940*0.001f -159.958*0.001f 200.000*0.001f

97.940*0.001f -199.958*0.001f -200.000*0.001f 97.940*0.001f -199.958*0.001f 200.000*0.001f 97.940*0.001f -159.964*0.001f 200.000*0.001f -2.068*0.001f

-199.958*0.001f 200.000*0.001f -2.068*0.001f -39.995*0.001f 200.000*0.001f -2.068*0.001f -79.985*0.001f 200.000*0.001f -2.068*0.001f -119.976*0.001f

200.000*0.001f -2.068*0.001f -159.964*0.001f -200.000*0.001f -2.068*0.001f -199.958*0.001f -200.000*0.001f -2.068*0.001f -39.995*0.001f -200.000*0.001f

tsecer@harry:

原文地址:https://www.cnblogs.com/tsecer/p/12038520.html