当前位置: 首页 > article >正文

主流架构(gcc、msvc、x86、x64、arm)中double与float浮点数保留精度(末尾清零)

​​​​​​float 是单精度浮点数,内存占4个字节,有效数字8位,表示范围是 -3.40E+38~3.40E+38。

double 是双精度浮点数,内存占8个字节,有效数字16位,表示范是-1.79E+308~-1.79E+308。

    C和C++标准没有指定EDCOX1、1、EDCOX1、0和EDCOX1×9的表示。这三个都有可能实现为IEEE双精度。然而,对于大多数架构(gcc、msvc、x86、x64、arm),float实际上是一个IEEE单精度浮点数(binary32),double是一个IEEE双精度浮点数(binary64)。

    有时甚至double也不够精确,因此有时我们有long double1(上面的例子在Mac上给出了9.00000000000000066),但所有浮点类型都有舍入错误,因此,如果精度非常重要(例如,货币处理),则应使用int或分数类。

    浮点会由于精度问题,导致无法直接做 != 比较,下面是一个主流架构下,优化处理浮点精度的函数:

#include <cmath>

// fVal		原始浮点
// iPoint	保留精度(末尾将清零)
double getVal1(const double fVal, const int iPoint) {
    double factor = pow(10.0, iPoint);
    return floor(fVal * factor) / factor;
}

double getVal2(const double fVal, const int iPoint) {
    double factor = pow(10.0, iPoint);
    return round(fVal * factor) / factor;
}

double getVal3(const double fVal, const int iPoint) 
{
	double	multiplier = 1.0;
	int 	i;
	
	// Calculate the multiplier based on the number of decimal places to keep
	for (i = 0; i < iPoint; i++) {
		multiplier *= 10.0;
	}
	
	// Multiply the original value by the multiplier and round it to the nearest integer
	int roundedValue = (int)(fVal * multiplier + 0.5);
	
	// Divide the rounded value by the multiplier to get the final result
	double result = roundedValue / multiplier;
	
	return result;
}


http://www.kler.cn/a/106576.html

相关文章:

  • 大模型基础BERT——Transformers的双向编码器表示
  • Python进程间通讯大揭秘:原理深度剖析与实战案例分享
  • STM32 标准库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别
  • 从北美火到中国,大数据洞察品牌“STANLEY”的突围之路
  • HarmonyOS 开发环境搭建
  • 机器学习 决策树
  • KV STUDIO的安装与实践(一)
  • <蓝桥杯软件赛>零基础备赛20周--第2周
  • [架构之路-243]:目标系统 - 纵向分层 - 架构是表面轮廓、内部骨架、未来蓝图,企业组织架构、信息系统架构、软件架构、应用程序就架构
  • Liunx两台服务器实现相互SSH免密登录
  • lossBN
  • Go实现网络通信
  • Ubuntu Linux下如何搭建并安装EDK2
  • C# 图解教程 第5版 —— 第8章 类和继承
  • 软考-网络安全漏洞防护技术原理与应用
  • 【Android】MQTT
  • Stable Diffusion 图生图+ControlNet list index out of range
  • JKPacket权威指南——学习建议
  • C++进阶语法——OOP(面向对象)【学习笔记(四)】
  • Cross-modal Variational Alignment of Latent Spaces
  • 274. H 指数
  • 短视频矩阵系统搭建/源头----源码
  • 评价聚类的方法
  • Java提升技术,进阶为高级开发和架构师的路线
  • 日志logback详解
  • 虚拟机安装openEuler系统