`
emowuyi
  • 浏览: 1509283 次
文章分类
社区版块
存档分类
最新评论

自己动手写C语言浮点数转换字符串函数

 
阅读更多

前几天,应一个小友要求,写了几个字符串转换函数帮助其进行语言学习,自觉其中的几个函数还比较满意,故发布在此,可供初学者参考。

浮点数转换字符串函数说简单也简单,说麻烦,也够烦心的,关键看你如何写了。简单点的几十行代码就行,复杂点的恐怕就的几百行代码了。如果还要考虑移植性、可读性甚至可维护性等就更麻烦的了。我一贯认为,一些事务性的项目应着重考虑移植性、可读性和可维护性等,而常用的带点系统性质的函数代码就应该以执行效率为主。

本文的浮点数转换字符串函数还是比较复杂的,基本可算得上较低层次的转换。由于我已经习惯了用BCB写C/C++代码,因此我写的浮点数转换字符串函数是80位扩展精度浮点数的,但那个小友拿回去试了一下,说他用的VC不支持80位扩展精度浮点数,虽然能定义long double变量,但实际上还是64位的,我只好又重写了一个64位双精度浮点数的,2个版本使用条件编译,这也算得上是移植性吧,呵呵。

下面是浮点数转换字符串函数的全部代码:

2个版本的代码加起来很长,但还有个自写的springf函数(下篇文章开始介绍)也要用到本文除FloatToSt函数外的全部代码。

代码开头的USE_EXTENDED为编译条件,如果你的编译系统不支持80位扩展精度浮点数,可将该定义注释掉。

前面说了,由于该代码主要是学习用的,因此数据转换层次较低,涉及到的有关浮点数格式的知识,可在网上搜索到。当然,知道是一回事,而具体怎样去操作则又是另一回事了,一些关键地方,我都作了较详细的注释,相信能对初学者正确理解浮点数格式有所帮助。例如,如何在不调用C有关函数,不使用汇编而快速的求一个浮点数的绝对值?本文代码就直接对浮点数进行操作:*((LPBYTE)&val + 7) &= 0x7f;(双精度浮点数)和*((LPBYTE)&val + 9) &= 0x7f;(扩展精度浮点数),也就是直接将浮点数的最高位置零,这当然比什么if (val < 0) val = -val语句快多了。不过,如果你要说后者的可移植性好,那我就无话可说了。要说可移植性,前者也可办到的,修改一下:*((LPBYTE)&val + sizeof(val) - 1) &= 0x7f;不就行了么,除非浮点数格式规则改变。只不过本文代码主要用来学习,用显式的方式更有意义。

80位扩展精度浮点数的有效数字为19位,而64位双精度浮点数有效数字为15 - 16位,本文的解析函数FloatResolve分别用了19位和17位的最大转换精度,尽可能的多显示几位,这主要是为自写的sprintf函数(另文介绍)做准备的,本文的浮点数转换字符串函数FloatToStr只用了最大15位的精度。

下面是个很简单的调用例子:


再次声明:本文代码主要供学习使用,如作其它用途,出问题慨不负责。

水平有限,错误在所难免,欢迎指正和指导。邮箱地址:maozefa@hotmail.com


分享到:
评论

相关推荐

    自己动手写C语言float浮点数转换字符串的函数

    本篇文章将深入探讨如何自己动手编写一个C语言函数,实现`float`类型的浮点数转换为字符串的功能。首先,我们需要理解浮点数在计算机中的表示方式,以及C语言中的相关标准库函数。 浮点数在计算机中通常使用IEEE ...

    C语言函数目录,和讲解

    这个目录通常会按照函数的功能分类,如输入/输出操作、字符串处理、数学运算、内存管理和类型转换等。每个函数都有其对应的原型,描述了函数的参数类型和返回值,以及简短的功能说明。通过这个目录,你可以快速查找...

    C语言实现Printf函数完整工程文件

    在C语言中,`printf`...通过这个完整的工程文件,你可以学习如何构建这样的自定义函数,理解I/O操作、格式化字符串处理、可变参数列表以及C语言的底层细节。这是一个很好的动手实践项目,可以帮助深化对C语言的理解。

    C语言库函数及其示例

    - `puts()` 用于打印字符串,末尾自动添加换行符。 - `getchar()` 和 `putc()` 用于逐字符读写。 2. **内存管理库函数**: - `malloc()` 动态分配内存,`calloc()` 分配并初始化为零的内存。 - `free()` 释放...

    C语言入门经典(第4版)--源代码及课后练习答案

    6.5 分析和转换字符串 219 6.5.1 转换字符 222 6.5.2 将字符串转换成数值 225 6.7 使用宽字符串 225 6.8 设计一个程序 228 6.8.1 问题 229 6.8.2 分析 229 6.8.3 解决方案 229 6.9 小结 237 6.10 习题 237...

    51单片机C语言编程入门(详讲版)

    例如,int型用于存储整数,char型用于存储字符,float型则用于存储浮点数。掌握如何声明变量、进行算术运算、条件判断(if-else)以及循环(for、while)是编程的基础。 在单片机编程中,理解并掌握函数的使用也至...

    C语言教程基础篇全免费.ppt

    转换控制字符串如`%f`表示输出浮点数,`%d`则用于输出整数。 在学习过程中,掌握不同数据类型是关键。C语言支持整型(如`int`)、长整型(`long`)、浮点型(`float`)、双精度型(`double`)、字符型(`char`)...

    printf:在该存储库中,我们将与Federico Blengio一起创建自己的“ printf”

    为了实现这个功能,我们需要对C语言的内存管理、类型转换、函数指针和格式化字符串的解析有深入的理解。这不仅是一个技术挑战,也是提升编程能力的好机会。通过编写自己的printf,我们可以更好地理解C语言的底层运作...

    Cours-C.zip_TP

    在C语言中,数据转换是常见的操作,可能涉及到整型、浮点型、字符串之间的转换,或者特定格式的输入输出,比如二进制和十进制的转换。这可能涵盖了类型转换函数如 `atoi()`、`atof()`、`printf()` 和 `scanf()` 等。...

    代码_词法分析_,词法分析程序,C,C++源码.zip

    例如,关键字如`if`、`else`、`while`等,标识符由字母、数字和下划线组成,常量可以是整数、浮点数或字符串,运算符包括算术运算符(+、-、*、/)、比较运算符(==、!=、&lt;、&gt;)和逻辑运算符(&&、||)等。 在词法...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    varchar2 1~4000字节 可变长度字符串,与CHAR类型相比,使用VARCHAR2可以节省磁盘空间,但查询效率没有char类型高 数值类型 Number(m,n) m(1~38) n(-84~127) 可以存储正数、负数、零、定点数和精度为38位的浮点数...

    Swift语言教程中文翻译

    字符串可以通过连接操作符`+`拼接,或者使用反斜杠(\)将值转换为字符串,例如: ```swift let label = "The width is" let width = 94 let widthLabel = label + String(width) // 字符串拼接 ``` 在Swift中,类型...

    06-14上机真题及答案1

    第三题要求将正数转换为科学计数法,需要用到浮点数处理和字符串格式化。 12年上机题涉及整数分解为连续整数和的问题,可以通过双层循环寻找所有可能的分解组合。对于给定的整数N,通过计算(m+n)(n-m+1)/2来判断...

    程序设计方法专题实验报告

    数字式时钟通常涉及到字符串处理和时间结构体的使用,如C语言中的`struct tm`,用于存储日期和时间。开发者需要理解和运用时间的闰年规则、小时制转换(12小时制和24小时制)以及时间格式化输出。圆盘式时钟的实现则...

    单片机程序之二进制转换

    在单片机编程中,C语言是常用的语言,它提供了内置的函数如`printf`和`scanf`来实现不同数制之间的转换。例如,`printf`可以接受格式化字符串来输出二进制、八进制、十进制或十六进制数,而`scanf`则用于从用户输入...

    Linux C编程一站式学习.pdf 高清下载

    - **数组与字符串**:讲解数组的使用,包括一维、多维数组和字符串操作。 #### 编码风格与调试工具 - **编码风格**:提供代码规范建议,如缩进、注释、命名等,以提高代码可读性和维护性。 - **gdb调试器**:演示...

    实验四-运算符和表达式和输入输出格式控制

    通过使用`%-&lt;宽度&gt;.&lt;精度&gt;f`的格式化字符串,可以实现左对齐输出: ```c void main() { float z = 3.5; printf("%-5.2f", z); // 左对齐,宽度为5,保留2位小数 } ``` #### 控制输出对齐 如果希望输出的数字...

    词法分析器完整程序课程设计(包含源代码,可执行程序)

    这些词素可以是关键字(如`int`、`for`)、标识符(用户自定义的变量名或函数名)、常量(数字、字符串)、运算符(`+`、`-`、`*`等)以及分隔符(逗号、括号等)。词法分析器通常会将这些词素转换成一系列的标记...

Global site tag (gtag.js) - Google Analytics