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:]]\)/\1\2./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:]]\)/.\1\2/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:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架