c语言float,double类型的理解

本文详细解析了float和double类型在计算机内存中的内部表示方式,包括符号位、指数位和尾数位的具体分配。通过实例说明了如何将十进制数转换为二进制,并解释了float类型的正负最大值、正负最小值和零值的表示及存储原理。同时,文章提供了在编程中比较浮点数与零的正确方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

float:1bit(符号位)+8bit(指数位,范围-128~127)+23bit(尾数位)

double:1bit + 11bit + 52bit

例:8.25(十进制) -----> 1000.01(二进制)   //1x2^3 +1x2^(-2)=8.25

      ------>(1.00001) x2^3-------->(1x2^0+1x2^(-5))x2^3 = 1x2^3 +1x2^(-2)=8.25

在内存中的表示:

030001

也就是(1.00001) x2^3,前面的1被预定,也就都是1。

 

所以float的极值问题:

正最大值:(1.111...11)x2^127=(1x2^0+ 1x2^(-1) + ... +1x2^(-23))x2^127 ≈ 2x2^127= 2^128≈ 3.4x10^38。

其中(1.111...111)的小数位是满23位。

正最小值可能:(1.0...0)x2^(-128)=2^(-128)≈ 2.9x10^(-39)。

负最大值可能:-(1.0...0)x2^(-128)=-2^(-128)≈ -2.9x10^(-39)。

负最小值:-{(1.111...11)x2^127}=-{(1x2^0+ 1x2^(-1) + ... +1x2^(-23))x2^127 }≈ -2x2^127= -2^128≈- 3.4x10^38。

注:0可以赋值给float变量,但存储时不为0,因为不精确,可能为(正最小值、负最大值、或其他值)。取出后,精度要求6(7)位,则为0.000000f。

例:当一个float变量和0比较时的程序为下,不应该直接比较。

//#include <stido.h>

float a1=-0.000001,a2=0.000001;

float b=0;

int Compare_floatandzore()

{

    if(b>=a1 && b=<a2)

   {

         printf("b等于0"); 

         return 1;

   }     

    else

  {

          printf("b不等于0");

          return 1;

  }

}

 

 

 

 

### 实现2270伺服电机角度精确控制的方法 对于2270舵机的角度控制,可以采用多种方式来实现其精确控制。具体取决于所使用的控制系统平台和技术栈。 #### 使用CANopen协议进行控制 如果选择通过CANopen协议来进行2270舵机的控制,则可以根据已有的开源项目作为基础[^1]。这些资源提供了完整的示例代码库以及详细的配置文件和使用说明,能够帮助开发人员快速理解并实施CANopen协议下的伺服电机控制逻辑。通常情况下,在CANopen网络环境中,主站会发送PDO(Process Data Object)消息给从站设备(即伺服驱动器),其中包含目标位置指令和其他必要的参数设置。 ```cpp // C++ 示例:向指定节点ID发送PDO报文以设定目标角位移 void sendTargetPosition(int nodeId, float targetAngle){ CanMsg msg; msg.id = PDO_TX_ID + nodeId; // 构建PDO传输帧ID encodeFloatToBytes(targetAngle, &msg.data[0]); // 将浮点数编码成字节流 canSend(msg); // 发送CAN消息至总线 } ``` 此段C++伪码展示了如何构建并向特定节点发送含有期望转动角度的目标命令。实际应用时需参照具体的硬件手册调整函数定义与数据格式转换细节。 #### 利用Simulink搭建模型仿真环境 另一种途径是借助MATLAB/Simulink工具链建立虚拟原型用于测试验证目的。这种方式特别适合于前期算法设计阶段或是当物理样件尚未准备好之前开展预研工作。按照既定的位置闭环反馈机制创建模块化框图结构,并利用内置组件模拟真实世界里的传感器信号采集过程及执行机构响应特性[^2]。 ```matlab % MATLAB脚本片段:初始化S-function block关联外部C/C++程序接口 set_param('servoControlModel/Controller', 'ParameterName', num2str(Kp)); set_param('servoControlModel/Motor Plant', 'ExternalInputFcn', @readSensorData); sim('servoControlModel'); % 运行整个系统级仿真的同时记录输出变量变化趋势曲线供后续分析评估之用 ``` 上述Matlab语句示范了怎样定制控制器增益系数Kp并通过调用自定义输入处理子程序完成在线调试任务;此外还能保存运行期间产生的中间结果以便进一步审查优化策略的有效性。 #### 基于FPGA内部逻辑电路的设计方案 最后一种可能的选择是在现场可编程门阵列(FPGA)芯片上部署专门针对该类负载特性的PWM波形发生单元。这种方法允许更细粒度地掌控脉宽调制周期内的高低电平切换时机从而达到更高的精度水平。下面给出了一部分VHDL描述语言编写的框架示意: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity Servo_PWM is Port ( clk : in STD_LOGIC; rst_n : in STD_LOGIC; angle_setpoint : in INTEGER range 0 to 180; pwm_out : out STD_LOGIC ); end Servo_PWM; architecture Behavioral of Servo_PWM is signal counter : integer := 0; constant period : integer := 20000; -- 定义一个完整周期内计数值上限(对应约20ms) begin process(clk,rst_n) begin if(rising_edge(clk))then if(counter >= period-1 or reset='0') then counter <= 0; elsif(angle_setpoint*period/180 > counter) then pwm_out<='1'; counter<=counter+1; else pwm_out<='0'; counter<=counter+1; end if; endif; end process; end Behavioral; ``` 这段VHDL代码实现了基本的比例映射关系,即将用户提供的角度范围映射到合适的占空比区间之内,进而影响最终输出端口上的高电平时长比例,以此间接调节连接着接收方器件的工作状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值