精华内容
下载资源
问答
  • 在学习C语言中的if语句中,我遇到了变量与零进行比较的一些问题,当比较的数值为浮点变量时,能直接用 if (x == 0.0)或者 if (x != 0.0) ,由于float和 double类型的数据都是有精度限制的,所以0.0000...0001=0...

           在学习C语言中的if语句中,我遇到了变量与零值进行比较的一些问题,当比较的数值为浮点变量时,不能直接用 if (x == 0.0)或者 if (x != 0.0) ,由于float和 double类型的数据都是有精度限制的,所以0.0000...0001=0(超过一定的精度限制),所以有时候会得到错误的结果。

           现在我们假设一个EPSINON 为定义好的精度,如果一个数落在[0.0-EPSINON,0.0+EPSINON]这个闭区间 内,我们认为在某个精度内它的值与零值相等;否则不相等。

            扩展一下,把 0.0替换为你想 比较的任何一个浮点数,那我们就可以比较任意两个浮点数的大小了,当然是在某个精度 内。

             同样的我们也不要在很大的浮点数和很小的浮点数之间进行运算,比如: 10000000000.00 + 0.00000000001

    这样计算后的结果可能会让人觉得很奇怪。


    代码如下:

    #include<stdio.h>
    int main()
    {
        float a,b;
        a=1000000000.00;
        b=0.00000000001;
        printf("%f",a+b);
        getchar();
        return 0;
    } 

    输出结果为 因为float只能表示小数点后6位,后面的被机器所截断。





    但是,当整数部分保留到11位时,得到的结果却是这样。

    #include<stdio.h>
    int main()
    {
        float a,b;
        a=10000000000.00;
        b=0.000001;
        printf("%f",a+b);
        getchar();
        return 0;
    } 
    打印结果却为:

         因此我便查阅了《林锐-高质量c++c编程指南》一书中的如下内容:



    if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。

    4.3.1   布尔变量与零值比较

    【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。
            根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如Visual   C++   将TRUE定义为1,而Visual   Basic则将TRUE定义为-1。
    假设布尔变量名字为flag,它与零值比较的标准if语句如下:

    if   (flag) //   表示flag为真
    if   (!flag) //   表示flag为假

    其它的用法都属于不良风格,例如:

    if   (flag   ==   TRUE)
    if   (flag   ==   1   )
    if   (flag   ==   FALSE)      
    if   (flag   ==   0)

    4.3.2   整型变量与零值比较

    【规则4-3-2】应当将整型变量用“==”或“!=”直接与0比较。
           假设整型变量的名字为value,它与零值比较的标准if语句如下:

    if   (value   ==   0)      
    if   (value   !=   0)

    不可模仿布尔变量的风格而写成

    if   (value) //   会让人误解   value是布尔变量
    if   (!value)   

    4.3.3   浮点变量与零值比较

    【规则4-3-3】不可将浮点变量用“==”或“!=”与任何数字比较。
    千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“> =”或“ <=”形式。
    假设浮点变量的名字为x,应当将

    if   (x   ==   0.0)   //   隐含错误的比较
    转化为   
    if   ((x> =-EPSINON)   &&   (x <=EPSINON))(此处为浮点数与零值进行比较的正确方式)

    其中EPSINON是允许的误差(即精度)。

    4.3.4   指针变量与零值比较

    【规则4-3-4】应当将指针变量用“==”或“!=”与NULL比较。
    指针变量的零值是“空”(记为NULL)。尽管NULL的值与0相同,但是两者意义不同。假设指针变量的名字为p,它与零值比较的标准if语句如下:

    if   (p   ==   NULL) //   p与NULL显式比较,强调p是指针变量
    if   (p   !=   NULL)

    不要写成

    if   (p   ==   0)   //   容易让人误解p是整型变量
    if   (p   !=   0)    
           
    或者

    if   (p) //   容易让人误解p是布尔变量
    if   (!p)

    4.3.5   对if语句的补充说明
    有时候我们可能会看到   if   (NULL   ==   p)   这样古怪的格式。不是程序写错了,是程序员为了防止将   if   (p   ==   NULL)   误写成   if   (p   =   NULL),而有意把p和NULL颠倒。编译器认为   if   (p   =   NULL)   是合法的,但是会指出   if   (NULL   =   p)是错误的,因为NULL不能被赋值。
    程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序

    if   (condition)
         return   x;
         return   y;
    改写为
    if   (condition)
    {
        return   x;
    }
    else
    {
         return   y;
    }
    或者改写成更加简练的   
    return   (condition   ?   x   :   y);

    展开全文
  • 如何判断一个字符串是合法的数值、浮点或者科学计数的格式? 首先想到的是正则表达式。 一些匹配规则如下: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" ...

    背景

    如何判断一个字符串是合法的数值、浮点或者科学计数的格式?

    首先想到的是正则表达式。

    一些匹配规则如下:

      "^\d+$"                   //非负整数(正整数   +   0)       
      "^[0-9]*[1-9][0-9]*$"     //正整数       
      "^((-\d+)|(0+))$"         //非正整数(负整数   +   0)       
      "^-[0-9]*[1-9][0-9]*$"    //负整数       
      "^-?\d+$"               //整数       
      "^\d+(\.\d+)?$"           //非负浮点数(正浮点数   +   0)       
      "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"     //正浮点数       
      "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"                                                      //非正浮点数(负浮点数   +   0)       
      "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数       
      "^(-?\d+)(\.\d+)?$"       //浮点数  
    

    PostgreSQL支持正则表达,UDF函数,可以完成这项工作。

    正文

    将正则表达式写成函数即可完成对应的判断,例子

    create or replace function check_int(text) returns boolean as $$  
      select $1 ~ '^\d+$';  
    $$ language sql strict;  
    

    验证

    postgres=# select check_int('1');  
     check_int   
    -----------  
     t  
    (1 row)  
      
    postgres=# select check_int('123');  
     check_int   
    -----------  
     t  
    (1 row)  
      
    postgres=# select check_int('123.1');  
     check_int   
    -----------  
     f  
    (1 row)  
      
    postgres=# select check_int('');  
     check_int   
    -----------  
     f  
    (1 row)  
      
    postgres=# select check_int('abc');  
     check_int   
    -----------  
     f  
    (1 row)  
    

    如果不区分格式的话,可以使用PostgreSQL的强制转换以及函数来处理,使用异常捕获即可。

    postgres=# create or replace function check_numeric(text) returns boolean as $$  
    declare  
    begin  
      perform ($1)::numeric;  
      return true;  
    exception when others then  
      return false;  
    end;  
    $$ language plpgsql strict;  
    CREATE FUNCTION  
    

    验证

    postgres=# select check_numeric('12..1');  
     check_numeric   
    ---------------  
     f  
    (1 row)  
      
    postgres=# select check_numeric('12.1');  
     check_numeric   
    ---------------  
     t  
    (1 row)  
      
    postgres=# select check_numeric('12.1a');  
     check_numeric   
    ---------------  
     f  
    (1 row)  
    

    如果你要强转异常的值,可以自定义cast进行转换,例子.

    postgres=# select '12.1a.1'::text::numeric;    
    ERROR:  invalid input syntax for type numeric: "12.1a.1"    
        
    postgres=# create or replace function text_to_numeric(text) returns numeric as $$    
    select to_number($1,'9999999999999999999999999.99999999999999');    
    $$ language sql strict;    
    CREATE FUNCTION    
    postgres=# select text_to_numeric('12.1a.1');    
     text_to_numeric     
    -----------------    
               12.11    
    (1 row)    
        
    postgres=# create cast (text as numeric) with function text_to_numeric(text) ;    
    CREATE CAST    
        
    postgres=# select '12.1a.1'::text::numeric;    
     numeric     
    ---------    
       12.11    
    (1 row)    
    

    补充

    补充 
    
    //正则匹配 
    
    匹配中文字符的正则表达式: [\u4e00-\u9fa5] 
    
    匹配双字节字符(包括汉字在内):[^\x00-\xff] 
    
    匹配空行的正则表达式:\n[\s| ]*\r 
    
    匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 
    
    匹配首尾空格的正则表达式:(^\s*)|(\s*$)(像vbscript那样的trim函数) 
    
    匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 
    
    匹配网址URL的正则表达式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)? 
    展开全文
  • 浮点异常

    千次阅读 2012-01-05 15:53:01
    这里所要说的浮点异常就是这种表示产生的几种特殊,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊: 1. 零:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且...

    今天遇到一个有趣的问题,就是浮点数什么时候是无效的,或者说is Not a Number (Nan),坦白说,写了这么久(有10年了吧)也没有留意过这个问题,开始遇到这个问题的时候,最先想到的还是googlebaidu,顺便用了下我们公司的有道(www.yodao.com,做个广告),都没有找到完美的答案,相反寻求答案的帖子到随处都是,看来还是有很多人碰到过这个问题,经过一番测试,给出一个比较完备的list

    形如

    结果

    Vc表示为

    0/0

    NaN

    -1.#IND

    N/0 (N>0)

    Infinite

    1.#INF

    -N/0 (N>0)

    -Infinite

    -1.#INF

    0 * INF

    NaN

     

    0 * -INF

    NaN

     

    0 / INF

    0

     

    INF * INF

    Infinite

     

    INF * -INF

    -Infinite

     

    INF / 0

    Infinate

     

    N * INF

    INF

     

    NaN 参与计算

    NaN

     

    以上结果是在vc2005中浮点数计算的测试结果,默认情况下,在vc2005中除0.0计算不会抛出异常,只是计算的结果可能是NaN或者Inf,这在实际的编程中是件让人头疼的事情,我们会不知不觉陷入浮点异常的陷阱,最终的结果不如预期,而要找到这个浮点计算的罪魁祸首可能需要很长时间的调试,因为NaNInf还是可以继续参与计算的。

    为了避免浮点计算异常,我们可以通过_controlfp函数设置开启浮点异常检查:

          _controlfp(_EM_INVALID,_MCW_EM);

    这样当计算出现INFNaN的时候,会抛出异常,这样变可以快捕捉错误,从而处理,更多信息可以参考MSDN/fp (Specify Floating-Point Behavior)章节。

    知道了浮点出会出现NaN,如果不抛出异常的情况下,我们如何判断一个浮点数时不时NaN呢?使用_isnan函数吧,这里需要注意的是INF是一个合法的浮点数,及is a number,所以_isnan函数的检查是可以通过,如果想知道一个float是不是infinite,使用_finiate函数可以检查这样的情况?

    转自:http://www.sineysoft.com/blog/post/float_exception.html

    浮点异常值:NAN,QNAN,SNAN

    32位浮点数在机器中的表示按照IEEE的标准是这样的:

       +------+----------------+-------------------------------+   
       | 1bit    |   8bit               |         23bit                            |   
       +------+----------------+-------------------------------+

    其中:1bit表示符号位(0表示正,1表示负),8bit表示指数(0~255,实际指数取值还要减去127,即指数取值区间为-127~128),23bit表示尾数。

    这里所要说的浮点异常值就是这种表示产生的几种特殊值,IEEE规定根据指数和尾数的不同分别可表示如下几种特殊值:

    1. 零值:按上述的浮点表述形式如果指数部分全部为0,并且尾数全部为0,则表示为浮点0.0,并且规定-0 = +0

    2. 非规格化值:如果指数全部为0,尾数非0,则表示非规格化的值,16进制看到的就是[80xxxxxx]h或者[00xxxxxx]h

    3. 无穷值:如果指数全部为1,尾数全部为0,则根据符号位分别表示正无穷大和负无穷大,16进制看到的就是[FF800000]h或者[7F800000]h

    4. NAN:主角来了,如果指数全部为1,尾数非0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,最常见的莫过于除0运算;SNAN一般被用于标记未初始化的值,以此来捕获异常。

    那么既然NAN不是一个真实的数值,在程序如何判断变量是否变成了NAN呢?大部分语言中针对NAN值都有一系列的函数定义,C语言中最常见的三个函数:

    _isnan(double x);                  //判断是否为NAN

    _finite(double x);                  //判读是否为无穷大

    _fpclass(double x);                //返回一系列的定义值,如:_FPCLASS_QNAN, _FPCLASS_SNAN,具体参考MSDN

    转自: http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html


    展开全文
  • 能检查表达式合法性:括号匹配,小数点检查,空格处理,操作符检查 能求多位小数 整数 能检查表达式合法性:括号匹配,小数点检查,空格处理,操作符检查 能求多位小数 整数
  • 识别浮点常量问题

    2020-09-13 18:08:15
    输入一个小C语言源程序,源程序长度超过2000个字符,保证输入合法。 Output 按照源程序中单词出现顺序输出,输出二元组形式的单词串。 (单词种类,单词) 单词一共5个种类: 关键字:用keyword表示 自定义标识符:...

    Pascal语言对浮点常量的语法要求是:一个浮点常量除了十进制数码之外,必须带有一个小数点或一个指数(紧接在字母e或E之后,在正式文档中也被称为比例因子)。如果该浮点常量含有小数点,则在小数点两侧都至少要有一个十进制数码。当然,在整个浮点常量或指数之前,也许会出现符号+或-。指数不能包含小数。空格也许会出现在浮点常量的前后,但不会出现在浮点常量中间。
    Input
    输入只有一行,就是有待识别的字符串。字符串的长度不超过255。
    Output
    请将分析的结果按以下样例的格式输出。如果输入文件中的字符串是Pascal浮点常量,请输出字符串“YES”,否则输出字符串“NO”。

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string s;
        cin>>s;
    
        int i=0;
        if(s[i]=='+'||s[i]=='-'||(s[i]>='0'&&s[i]<='9'))
        {
            i++;
        }
        else
        {
            cout<<"NO"<<endl;
            return 0;
    
        }
    
        while(s[i]>='0'&&s[i]<='9')
        {
            i++;
        }
    
    
        if(s[i]=='.')
        {
    
            int i1=i-1,i2=i+1;
            if((s[i1]>='0'&&s[i1]<='9')&&(s[i2]>='0'&&s[i2]<='9'))
            {
                i++;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
            while((s[i]>='0'&&s[i]<='9'))
            {
                i++;
            }
            if(s[i]=='E'||s[i]=='e')
            {
                i++;
            }
            else if(s[i]=='\0')
            {
                cout<<"YES"<<endl;
                return 0;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
            if(s[i]=='+'||s[i]=='-'||(s[i]>='0'&&s[i]<='9'))
            {
                i++;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
            while((s[i]>='0'&&s[i]<='9'))
            {
                i++;
            }
            if(s[i]=='\0')
            {
                cout<<"YES"<<endl;
                return 0;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
        }
        else if(s[i]=='E'||s[i]=='e')
        {
            i++;
            if(s[i]=='+'||s[i]=='-'||(s[i]>='0'&&s[i]<='9'))
            {
                i++;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
            while((s[i]>='0'&&s[i]<='9'))
            {
                i++;
            }
            if(s[i]=='\0')
            {
                cout<<"YES"<<endl;
                return 0;
            }
            else
            {
                cout<<"NO"<<endl;
                return 0;
            }
        }
        else
        {
            cout<<"NO"<<endl;
            return 0;
        }
    
    
    }
    
    展开全文
  • 浮点型表示方法

    千次阅读 2018-08-19 23:47:00
    今天在牛客刷题时,遇到了一题浮点型表示类型的题目,因为之前没接触,故记录下来。 浮点型的通用表达式 ...其中,R在计算机中通过用2,8或16表示,是个确定的常量。 因此,在已知标准下,要表示浮点...
  • 汇编语言浮点指令

    千次阅读 2017-12-04 15:07:54
    浮点数如何存储浮点寄存器浮点数指令浮点计算例子浮点高级运算CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数,从寄存器到指令,都有一套独特的处理流程,浮点单元也称作x87 FPU。 现在看浮点数...
  • 注意:格式符的个数要与变量、常量或者表达式的个数一一对应 不可改变的常量 在程序执行过程中,值不发生改变的量称为常量。 mtianyan: C语言的常量可以分为直接常量和符号常量。 直接常量也称为字面量,是可以直接...
  • python浮点型数据

    千次阅读 2018-02-02 10:01:04
    浮点型数据有2中表示方法:小数和指数。 小数方法 例如3.14, 0.314, 31.4 等等。python允许小数点后面接任何数字,表示小数点部分是0. 例如,31. 就是31.0。 指数方法 就是用科学计数法表示,以e(或E)为底表示...
  • 本来是想写一个函数,在下发参数时,传QLineEdit的字符串参数进去,然后判断是否合法,如果不合法,则下发参数,请用户修改后再确认。这么做也实现了,但是想Qt这么强大,应该会考虑到这一点的,...
  • IEEE浮点标准详解

    万次阅读 2016-07-05 09:39:51
    IEEE定义了多种浮点格式,但最常见的是三种类型:单精度、双精度、扩展双精度,分别适用于不同的计算要求。一般而言,单精度适合一般计算,双精度适合科学计算,扩展双精度适合高精度计算。一个遵循IEEE 754标准的...
  • 在介绍完 Objective-C 中的四大基本类型之一 int 类型 后,接下来不得提的就是 float 类型。声明为 float 类型的变量可存储包含小数位的值。要区分浮点常量,可通过...要显示浮点值,可用 NSLog 转换字符 %
  • C语言浮点型字面值常量的书写形式

    万次阅读 2018-10-10 20:44:05
    C语言浮点型字面值常量的书写形式: ... ANSI标准规定的浮点数所能容纳的最小范围是10e-37~10e37之间的任何。 ANSI标准规定了long double至少和double一样长,double至少和short一样长。 以下代码给出了几种浮...
  • 浮点数与IEEE浮点标准

    千次阅读 2017-02-24 09:18:57
    IEEE定义了多种浮点格式,但最常见的是三种类型:单精度、双精度、扩展双精度,分别适用于不同的计算要求。一般而言,单精度适合一般计算,双精度适合科学计算,扩展双精度适合高精度计算。一个遵循IEEE 754标准的...
  • 实型数据也称为浮点数或实数。 在C语言中,实数只采用十进制。...、-267.8230 等均为合法的实数。 注意,必须有小数点。 2) 指数形式 由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带
  • fetestexcept和feclearexcept是两个处理浮点运算异常的函数,在头文件是中,该头文件中包含一系 列的处理浮点运算异常的函数,而我们今天介绍的是两个最简单,又是最常用的函数。...用于查询指定异常excepts的状态
  • 浮点异常情况(VX_FP_TASK) .

    千次阅读 2013-09-24 12:33:09
     当没有设置浮点计算标识VX_FP_TASK时,在进入任务时没有保存浮点寄存器,这样在任务中进行浮点运算将破坏了浮点寄存器的内容,而在任务退出后,浮点寄存器能恢复,造成其他任务在进行浮点计算时出现浮点运算...
  • 其中用到了将字符串转化为float类型,在很多题中都可能要求输入数据,但考虑到可能存在输入异常,能直接利用整型或浮点型存储,第一步都是先使用字符串或者字符型数组,将符号和数字统一看作字符进行存储。...
  • 题目:对于一种具有n位小数的浮点格式,给出能准确描述的最小正整数的公式(因为想要准确表示它可能需要n+1位小数)。假设阶码字段长度k足够大,可以表示的阶码范围不会限制这个问题。 思路一:首先可以排除非规格...
  • 汇编语言学习笔记(十二)-浮点指令

    万次阅读 2017-02-07 14:23:37
    浮点数如何存储浮点寄存器浮点数指令浮点计算例子浮点高级运算CMOV移动指令 浮点数如何存储 浮点数的运算完全不同于整数,从寄存器到指令,都有一套独特的处理流程,浮点单元也称作x87 FPU。 现在看浮点数...
  • c语言提供的合法的数据类型关键字是“float”,是浮点型数据类型,用于存储单精度浮点数或双精度浮点数,浮点类型的单精度具有4个字节,包括一个符号位、一个8位二进制指数和一个23位尾数。推荐:《c语言教程》...
  • 实验2-4 浮点型数据的输入输出

    千次阅读 2012-01-27 22:02:08
    比照整型数据输入输出的探讨方式,研究浮点型数据的输入输出,在加深理解的基础上能熟练使用浮点型数据。 实验步骤: //分数22/7小数点后有几位?如果用它表示圆周率可以精确到哪一位? 1.填表并分析 ...
  • 计算机系统结构 | 浮点数据表示的学习笔记

    千次阅读 多人点赞 2017-10-06 12:18:54
    目录 浮点数的数据表示 浮点数在数据存储单元中的存放方式 浮点数的表数范围 尾数采用原码的取值范围 尾数采用补码的取值范围 ...尾数的 m ; 阶码的 e ; 尾数的基 rm ; 阶码的基 re ; 尾数长度 ...
  • 取得选中的列的文本ddl.options[ddl.selectedIndex].innerText 取得选中相对应的valueddl.options[ddl.selectedIndex].value获取索引var selectIndex=document.getElementById("DropDownList1").selected
  • C++中字符串与整型浮点型之间的转换 atof(将字符串转换成浮点型数) 相关函数 atoi,atol,strtod,strtol,strtoul   表头文件 #include    定义函数 double atof(const char *nptr);   函数说明...
  • 将整型赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。注意:赋值时的类型转换实际上是强制的。例如执行赋值后,无论5.4还是5.6都会变成5。扩展资料:C语言中其它数据类型的转换:1、单、...
  • 与零的比较分为布尔变量、整形变量、浮点变量、指针变量 布尔变量 bool flag; if(flag)表示flag为真 if(!flag)表示flag为假 整形变量 int value; if(value == 0) if(value != 0) 浮点变量 无论是float还是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,800
精华内容 13,120
关键字:

不合法的浮点值