首页 > 其他分享 >自己实现sprintf功能,用于把三个float转换成字符串格式,速度比sprintf快了20倍

自己实现sprintf功能,用于把三个float转换成字符串格式,速度比sprintf快了20倍

时间:2024-07-17 09:55:07浏览次数:19  
标签:10 20 ++ float DecimalNum sprintf 100 buffLen buff

  float转字符串使用sprintf太慢了,自己实现sprintf功能,用于把三个float转换成字符串格式,速度比sprintf快了20倍!运行结果如下图:

例程:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define RUN_COUNT  10000000 // 运行次数 

/*实现sprintf功能,用于把三个float转换成字符串格式*/ 
/********************************************
* @brief 读现sprintf功能,用于把三个float转换成字符串格式*
* @param [in] num1 浮点数 num2 浮点数,num3 浮点数, [out] buff:字符串
* @return   字符串长度 
* @Author	lzb
* @Time		2024/07/16
*********************************************/
int my_sprintf(float num1, float num2, float num3, int num4, char buff[]);

int main() 
{
	printf("\n"); 
	clock_t start, end;  
    double cpu_time_used;  
    
    float outData[10] = {-0.999, -0.164, 2.499};
    char date[128] = {0};
	 
	int i = 0;
	// 记录开始时间  
    start = clock();  
    memset(date, 0, sizeof(date)); 
	for(i=0; i<RUN_COUNT; i++)
	{
    	my_sprintf(outData[0], outData[1], outData[2],0, date);	
	}
	// 记录结束时间  
    end = clock();
    // 计算并打印运行时间  
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;  
    printf("my_sprintf运行%d次使用时间: %f 秒\n", RUN_COUNT, cpu_time_used); 
    printf("date1: %s", date); 	
	
	printf("\n\n"); 
	
	// 记录开始时间  
    start = clock(); 
	memset(date, 0, sizeof(date)); 
	for(i=0; i<RUN_COUNT; i++)
	{
		sprintf(date, "%.3f %.3f %.3f\n", outData[0], outData[1], outData[2]);
	}
	// 记录结束时间  
    end = clock();
    // 计算并打印运行时间  
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;  
    printf("sprintf运行%d次使用时间: %f 秒\n", RUN_COUNT, cpu_time_used); 
    printf("date2: %s", date); 


    return 0;
}

int my_sprintf(float num1, float num2, float num3, int num4, char buff[])
{
    short buffLen = 0;
    int integerNum[3], DecimalNum[3];

    integerNum[0] = num1, integerNum[1] = num2, integerNum[2] = num3;
    DecimalNum[0] = ((float)((num1 - integerNum[0]) * 1000));
    DecimalNum[1] = ((float)((num2 - integerNum[1]) * 1000));
    DecimalNum[2] = ((float)((num3 - integerNum[2]) * 1000));

    // printf("\r\ndata: %0.3f %0.3f %0.3f\n", num1, num2, num3);
    // printf("integerNum: %d %d %d\n", integerNum[0], integerNum[1], integerNum[2]);
    // printf("DecimalNum: %d %d %d\n", DecimalNum[0], DecimalNum[1], DecimalNum[2]);
    if(integerNum[0] < 0 || DecimalNum[0]<0){
        integerNum[0] *= -1;
        DecimalNum[0] *= -1;
        buff[buffLen++] = '-';
    }

    if(integerNum[0] >= 100){ // 3 位
        buff[buffLen++] = integerNum[0] / 100 + '0';
        buff[buffLen++] = (integerNum[0] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[0] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[0] / 100 + '0';
        buff[buffLen++] = (DecimalNum[0] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[0] % 10 + '0';
    }else if(integerNum[0] >= 10){ // 2 位
        buff[buffLen++] = (integerNum[0] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[0] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[0] / 100 + '0';
        buff[buffLen++] = (DecimalNum[0] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[0] % 10 + '0';
    }else{
        buff[buffLen++] = integerNum[0] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[0] / 100 + '0';
        buff[buffLen++] = (DecimalNum[0] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[0] % 10 + '0';
    }
    buff[buffLen++] = ' ';

    if(integerNum[1] < 0 || DecimalNum[1]<0){
        integerNum[1] *= -1;
        DecimalNum[1] *= -1;
        buff[buffLen++] = '-';
    }
    if(integerNum[1] >= 100){ // 3 位
        buff[buffLen++] = integerNum[1] / 100 + '0';
        buff[buffLen++] = (integerNum[1] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[1] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[1] / 100 + '0';
        buff[buffLen++] = (DecimalNum[1] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[1] % 10 + '0';
    }else if(integerNum[1] >= 10){ // 2 位
        buff[buffLen++] = (integerNum[1] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[1] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[1] / 100 + '0';
        buff[buffLen++] = (DecimalNum[1] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[1] % 10 + '0';
    }else{
        buff[buffLen++] = integerNum[1] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[1] / 100 + '0';
        buff[buffLen++] = (DecimalNum[1] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[1] % 10 + '0';
    }
    buff[buffLen++] = ' ';

    if(integerNum[2] < 0 || DecimalNum[2]<0){
        integerNum[2] *= -1;
        DecimalNum[2] *= -1;
        buff[buffLen++] = '-';
    }
    if(integerNum[2] >= 100){ // 3 位
        buff[buffLen++] = integerNum[2] / 100 + '0';
        buff[buffLen++] = (integerNum[2] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[2] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[2] / 100 + '0';
        buff[buffLen++] = (DecimalNum[2] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[2] % 10 + '0';
    }else if(integerNum[2] >= 10){ // 2 位
        buff[buffLen++] = (integerNum[2] % 100) / 10 + '0';
        buff[buffLen++] = integerNum[2] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[2] / 100 + '0';
        buff[buffLen++] = (DecimalNum[2] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[2] % 10 + '0';
    }else{
        buff[buffLen++] = integerNum[2] % 10 + '0';

        buff[buffLen++] = '.';

        buff[buffLen++] = DecimalNum[2] / 100 + '0';
        buff[buffLen++] = (DecimalNum[2] % 100) / 10 + '0';
        buff[buffLen++] = DecimalNum[2] % 10 + '0';
    }

    if(num4 == 0){
        buff[buffLen++] = '\n';
        return buffLen;
    }
    buff[buffLen++] = ' ';

    if(num4 < 0){
        num4 *= -1;
        buff[buffLen++] = '-';
    }
    if(num4 >= 10000){ // 5 位
        buff[buffLen++] = num4 / 10000 + '0';
        buff[buffLen++] = (num4 % 10000) / 1000 + '0';
        buff[buffLen++] = (num4 % 1000) / 100 + '0';
        buff[buffLen++] = (num4 % 100) / 10 + '0';
        buff[buffLen++] = num4 % 10 + '0';
    }else if(num4 >= 1000){ // 4 位
        buff[buffLen++] = num4 / 1000 + '0';
        buff[buffLen++] = (num4 % 1000) / 100 + '0';
        buff[buffLen++] = (num4 % 100) / 10 + '0';
        buff[buffLen++] = num4 % 10 + '0';
    }else if(num4 >= 100){ // 3 位
        buff[buffLen++] = num4 / 100 + '0';
        buff[buffLen++] = (num4 % 100) / 10 + '0';
        buff[buffLen++] = num4 % 10 + '0';
    }else if(num4 >= 10){ // 2 位
        buff[buffLen++] = num4 / 10 + '0';
        buff[buffLen++] = num4 % 10 + '0';
    }else{ // 1 位
        buff[buffLen++] = num4 % 10 + '0';
    }

    buff[buffLen++] = '\n';
    return buffLen;
}

标签:10,20,++,float,DecimalNum,sprintf,100,buffLen,buff
From: https://blog.csdn.net/ZakaryBin/article/details/140469027

相关文章

  • 【App渗透】BurpSuite插件-Brida 2024最新自动加解密Custom plugins演示
    文章目录前言一、测试app的客户端和服务端二、BurpSuite设置代理三、反编译apk文件四、编写brida/fridahook脚本五、Customplugins自动加解密六、本期送书《二进制安全基础》如何领书总结前言之前有写过如何安装brida的文章和视频讲解,大家感兴趣的可以看看之前......
  • eclipse免安装版64位 2018版本
    前言Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。虽然大多数用户很乐于将Eclipse当作Java集成开发......
  • 2024年华为OD机试真题-符号运算-(C++/Java/python)-OD统一考试(C卷D卷)
      2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】    题目描述给定一个表达式,求其分数计算结果。表达式的限制如下:所有的输入数字皆为正整数(包括0)仅支持四则运算(+-*,/)和括号结果为整数或分数,分数必须化为最简格式(比如6,3/4,7/8,90/7)除数可能为0,如果遇到......
  • 题解|2024暑期牛客多校01
    【原文链接】太菜了就先挂4题,其他的写出来了再回来补QwQA.ABitCommon组合数学题目大意题目概括:给定两个整数nnn和m......
  • 2024年春季新番简评
    2024年春季新番简评四月:春天,春天与恋爱、美好等常常联系在一起。四月新番通常也是一年之中优秀动画最多的一个季度。2024年的春天,是一个原创动画和续作动画充满话题度的春天。忙完了期末考和期末实验,终于有机会来写新番记录了,这个学期真的有点心力憔悴,选了三门专选课,但是感觉又......
  • [题解]POJ2074 Line of Sight
    POJ2074LineofSight题意简述多测。给定若干条线段,全部与\(x\)轴平行。其中有\(2\)条线段表示房子和人行道(虽然翻译不是人行道就是了),保证房子在人行道上面。其他线段表示障碍物(不保证在房子和人行道之间)。请找出人行道上最长的连续部分,使得在这中间可以完整地看到房子的全......
  • 21世纪20年代了,还有人无脑喷前端非常简单??(附前端学习所有技术栈)
    前端基础:HTML、CSS、JavaScript前端高级:HTML5、CSS3、JavaScript语法规范:TypeScript、ECMAScrpit、Eslint、Prettier前端热门框架:Vue.js、React.js、Angular.js、Bootstrap、Nuxt.js、Svelte.js、Solid.js、Preact.js、TailwindCSS、UnoCSSJS常用方法组件库:Axios.js、JQuery、......
  • Intel Management Engine WMI Provider 2408.5.4.0 20240221 驱动程序 Intel管理引擎
    驱动程序"IntelManagementEngineWMIProvider2408.5.4.0"是指Intel管理引擎的一部分,它通过Windows管理仪表(WMI)提供对管理引擎功能的访问和管理。这些驱动程序通常用于管理和配置Intel管理引擎的功能,包括安全功能、远程访问以及系统监控等。如果您需要安装或更新这个驱......
  • [[BJWC2012] 冻结]
    [BJWC2012]冻结题目大意在能有\(k\)次机会使得某些道路变为其\(\frac{1}{2}\)长度的情况下,求\(1\)到\(n\)的最短路做法其实就是分层最短路的模板题,有\(k\)次机会减少,那么对于一个点来说就有可能是在这前使用了\(0\)~\(k\)次减少的机会到达的,每个点都有\(k\)个分身,故要建\(k+1......
  • 2024.7.16
    ###2024.7.16【Ineverlose.Ieitherwinorlearn.】###Tuesday六月十一---##0/1Trie学习笔记使用trie维护异或极值可以使用0/1Trie,这是一种以{0,1}为字符集的Trie树,他支持修改和全局加一使用异或操作时,我们其实并不需要知道每一位上的具体值,只需要知道每一位......