zoukankan      html  css  js  c++  java
  • 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:

  • 相关阅读:
    【NOIP2003提高组】加分二叉树
    【luogu1220】关路灯
    【luogu2583】地铁间谍
    Hello, World!
    python中的画笔控制函数
    python中库引用与import
    python中RGB色彩
    turtle角度坐标体系
    turtle空间坐标系
    python中turtle库的使用
  • 原文地址:https://www.cnblogs.com/tsecer/p/12038520.html
Copyright © 2011-2022 走看看