2017-03-19 43 views
0

我正在为C语言编写PIC单片机的代码。我有一个超过4位小数的浮点值。我想将它舍入到小数点后1位。四舍五入C中没有内置函数的浮点值

但问题是,我不能使用C语言提供的圆形,底板,细胞函数。

有没有其他的方法来做到这一点数学?

UPDATE 1:

我想显示连接到PIC微控制器的一个LCD的温度。我正在模拟温度传感器在-40 * C到50 * C的范围内线性地提供0-5V。

为此,我使用线性插值来确定温度。值显示在LCD上。这里是我的功能:

float Temp; 
void Read_Temp() 
{ 
    ADCON0 &= 0xC5;    //Clearing channel selection bits 
    ADCON0 |= 0<<3;    //Setting channel 0 selection bits 
    __delay_ms(2);    
    while(GO_nDONE);    
    unsigned int adc_value = ((ADRESH<<8)+ADRESL); 

    Temp = (adc_value * (90.0/1023.0)) - 40.0; // to show in celcius 

    if(TempMode == 'F') // to show in farenheit 
     Temp = (Temp*1.8)+32;  
} 

我正在使用库来连接液晶显示器。显示浮点值的函数有此评论的头文件在它旁边写着:

/* LCD_display_float: Displays a floating point numerical value on the LCD 
* This function take the parameter 'value' and displays it to the number of 
* decimal places specified by the parameter 'dplaces'. NOTE: The function 
* is limited to displaying 4 significant figures due to headroom limitations 
* of the 24 bit float type in MPLAB X. Attempting to display more than 4 
* significant figures will lead to the string "ERR" being displayed. */ 

void LCD_display_float (float value, unsigned char dplaces); 

所以,当我模仿我的代码,ERR写在LCD。我应该如何解决这个问题?

如果你们需要lcd_display_float()的定义,我也可以上传。

+1

如果该值不超过整数的范围,则可以将通常的乘以100,截断,根据lsd修改,除以100.如果是,则甚至可以这样做,但提取尾数将会比较棘手,更不用说把它放回去。但是,为什么你在微控制器上使用浮点运算? – StoryTeller

+1

'sprintf'和'atof'是否可用? –

+1

因为浮点是二进制的,所以实际上不能舍入到小数点后1位。这里没有0.1的确切表示。根据你想要做的事情,最好四舍五入到最接近的0.125。 –

回答

2

微控制器通常的解决方案是而不是这样做。小数位是为人类设计的,而这种奢侈品不属于嵌入式硬件。哎呀,即使是二进制浮点也有点奢侈。

您可能会看到十进制数学的唯一地方是I/O操作。对于这些情况,在内部使用整数是最容易的。所以范围0.0 - 6553.5在内部表示为0-65535。输出时,您只需打印value/10 . value%10

+0

请参考我添加到问题 – Mohsin

+0

的更新@Mohsin :我不会为此功能而烦心,或者一般来说都是“浮动”。 – MSalters

1

标准的方式做,这是向规模化,加0.5,截断和未规模:

float x; 

... 

x *= 10; 
x = (int)(x + 0.5); 
x /= 10; 

,或者在一个行:

x = (int)(x * 10 + 0.5)/10.; 

通过截断之前加入0.5诠释,你安排小数部分大于0.5的数字四舍五入。

但是还有其他两点考虑:

  1. 这个简单的,基本的四舍五入配方将处理负正确的数字。

  2. 大多数计算机上的浮点数不能精确地表示小数部分。所以你没有真的四舍五入x到“一个地方超过小数”。如果稍后打印x,则通常会发现它似乎包含一个数字,例如3.199999而不是3.2。对此你无能为力;通常的解决方案是使用printf格式,例如%.1f,以便打印出数字。一旦你使用像%.1f这样的printf格式,它会为你做所有的四舍五入,所以你不必这样做。

所以问题是,你实际上在做什么与你的浮点数,他们必须四舍五入到“小数点后一位”?你把它们打印成字符串,还是用它们做别的事情?如果你打印出来,你使用printf还是其他的东西?

+0

请参阅我添加到问题中的更新 – Mohsin