C标准库pow函数精度问题。

#include <stdio.h>
int main ()
{
int temp,i;
double a=2.4568;
unsigned char b[5];
for(i=0;i<5;i++)
{
temp=(int)a;
b[i]=temp+‘0‘;
a=(a-temp)*10;
printf("%f %d\n",a,(int)a);
}
b[5]=‘\0‘;
puts(b);
}

运行结果:

运行结果:
4.568000 4
5.680000 5
6.800000 6
8.000000 7
10.000000 9
24567
--------------------------------
Process exited with return value 0
Press any key to continue . . .
为什么最后的8.00000和10.00000被强制转换成7和9而不是8和10;

首先 float double这类的数据是近似值 有精度问题 这一点你知道吧

也就是说打印出来的8.0000 未必是8.00000

在你这个例子里面

我改了一下 改为打印出20位小数:

#include <stdio.h>
int main ()
{
     int temp,i;
     double a=2.4568;
    unsigned char b[5];
 for(i=0;i<5;i++)
 {
         temp=(int)a;
         b[i]=temp+‘0‘;
          a=(a-temp)*10;
          printf("%.20f %d\n",a,(int)a);
 }
         b[5]=‘\0‘;
         puts(b);
}

你再运行一下看看

可以发现8.00000实际上是7.99999999999872812850 所以会是转为int的7

一般来说 要把浮点转为int 要取得最近似的值 都是采用(int)(a+0.5) 从而达到一种四舍五入的效果

时间: 2024-10-12 16:34:45

C标准库pow函数精度问题。的相关文章

2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,

 1信号产生原因 2.进程处理信号行为 manpage里信号3中处理方式: SIG_IGN SIG_DFL                                            默认Term动作 a signal handling function 进程处理信号 A默认处理动作 term   中断 core    core(调试的时候产生) gcc –g file.c ulimit –c 1024 gdb a.out core ign      忽略 stop     停止

c/c++ 标准库 bind 函数 详解

标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参数可能包含入_1, _2等,这些是新函数newCallable的参数. 在这篇博客lambda 表达式 介绍 中,讨论了find_if的第三个参数的问题,当时是用lambda表达式解决的,有了bind函数后,也可以用bind函数解决. 解决办法:bind(check_size, _1, sz) au

转 Lua标准库: table函数, 数学函数, 字符串函数/格式化/配对, WoW新增函数, 函数别名

这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 collectgarbage() - 垃圾收集器. (新增于1.10.1) date(format, time) - 返回当前用户机器上的时间. error("error message",level) - 发生错误时,输出一条定义的错误

c++多线程编程:实现标准库accumulate函数的并行计算版本

今天使用c++实现了标准库头文件<numeric>中的accumulate函数的并行计算版本,代码如下,注释写的比较详细,仅对其中几点进行描述: ①该实现假定不发生任何异常,故没有对可能产生的异常进行处理 ②第42行的语句: const unsigned int num_thread = std::min((hardware_thread != 0 ? hardware_thread : 2), max_thread); 要运行的线程数是计算出的最大线程数和硬件线程数量的较小值.这是因为若运行

练习了下C标准库的函数

#include<stdio.h>  2 #include<string.h>  3 #include<stdlib.h>  4 #include <time.h>  5 int main()  6 {  7 int c=5,d;  8 char a[10]={"1abe"},b[8]={"1cdefg"};  9 //strncpy(a,b,3*sizeof(char));//strncpy复制字符串,删除原字符串 

Python 标准库、第三方库

Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清洗转换.数据计算和统计分析.图像和视频处理.音频处理.数据挖掘/机器学习/深度学习.数据可视化.交互学习和集成开发以及其他Python协同数据工作工具. 为了区分不同对象的来源和类型,本节将在描述中通过以下方法进行标识: [Python内置函数]:Python自带的内置函数.函数无需导入,直接使用.

c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

(转)c运行库、c标准库、windows API的区别和联系

C运行时库函数C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的.  API函数API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的. 区别他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的. ·1.运行时库就是 C run-time library,是C而非C++语言世界的概念.     取这个名字就是因为你的C程序运行时需要这些库中的函数. ·2.C语言是所谓的“小内核”语言,就其语言本身来说很

python 装饰器及标准库functools中的wraps

最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点是工作流程. 首先常见的 装饰器 格式就是通过@语法糖,简便的写法,让流程有些不太清楚. 装饰器不带参数的情况下: def deco(func):     def _deco():         print("before myfunc() called.")         func(