小工具 - 浮点计算器

淘晶驰串口屏: 复刻苹果计算器,虚拟浮点数和触摸热区控件保姆级实战教程 上一篇博客实现了串口屏基础加减乘除运算,但存在功能局限。本文聚焦于利用淘晶驰串口屏的虚拟浮点数控件,对计算器进行功能升级,实现与苹果计算器相近的使用体验。核心优化包括支持负数输入与显示、精准小数点运算、百分号快捷计算,并确保界面布局与苹果系统自带计算器视觉一致。通过设计变量表与运算逻辑,详细拆解文本转浮点数、浮点数运算、结果转文本等流程,结合数字、运算符等控件及触摸热区控件的代码实现,完成功能开发。经点击调试、模拟器测试与硬件测试验证,计算器运行正常。不过,目前暂不支持复合运算与连续运算符输入,后续可探索拓 阅读详情
AI摘要

博主在学习CE调试时,为方便查看内存中4字节对应的浮点值,开发了浮点计算器小工具。最初采用测试程序查看结果,较为繁琐,后花半天编写此工具。编程环境为vs2019 mfc dlg。

小工具 - 浮点计算器

概述

在学习CE, 在调试过程中, 经常要看内存中浮点对应的4字节内存到底对应的是啥具体的浮点值. e.g. 0x42860000 => 67.00
转换逻辑挺简单的

float CFloatCalcDlg::uint32_to_float(uint32_t u)
{
	return (*(float*)&u);
}

开始写了一个测试程序, 直接改4字节的值, 编译运行一下, 看打印出的结果.
但是要经常看内存中的4字节数据对应的浮点值, 不胜其烦.
花了半天, 写了一个小工具, 方便多了.
在这里插入图片描述

笔记

编程环境 : vs2019 mfc dlg

FloatCalcDlg.cpp


// FloatCalcDlg.cpp: 实现文件
//

#include "pch.h"
#include "framework.h"
#include "FloatCalc.h"
#include "FloatCalcDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_ABOUTBOX };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CFloatCalcDlg 对话框



CFloatCalcDlg::CFloatCalcDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_FLOATCALC_DIALOG, pParent)
	, m_cs4ByteIn(_T(""))
	, m_cs4ByteOut(_T(""))
	, m_csFloatIn(_T(""))
	, m_csFloatOut(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFloatCalcDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT_TIP, m_ctrlTip);
	DDX_Text(pDX, IDC_EDIT_4BYTES_IN, m_cs4ByteIn);
	DDX_Text(pDX, IDC_EDIT_4BYTES_OUT, m_cs4ByteOut);
	DDX_Text(pDX, IDC_EDIT_FLOAT_IN, m_csFloatIn);
	DDX_Text(pDX, IDC_EDIT_FLOAT_OUT, m_csFloatOut);
}

BEGIN_MESSAGE_MAP(CFloatCalcDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDOK, &CFloatCalcDlg::OnBnClickedOk)
	ON_BN_CLICKED(IDCANCEL, &CFloatCalcDlg::OnBnClickedCancel)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BUTTON_FLOAT_TO_4BYTES, &CFloatCalcDlg::OnBnClickedButtonFloatTo4bytes)
	ON_BN_CLICKED(IDC_BUTTON_4BYTES_TO_FLOAT, &CFloatCalcDlg::OnBnClickedButton4bytesToFloat)
END_MESSAGE_MAP()


// CFloatCalcDlg 消息处理程序

BOOL CFloatCalcDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != nullptr)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	this->SetWindowTextW(TEXT("浮点计算器"));

	addMsg(TEXT("功能:\r\n"));
	addMsg(TEXT("1. 输入浮点数, 转换成4字节\r\n"));
	addMsg(TEXT("2. 输入4字节, 转换成浮点数\r\n"));

	// for test
	this->m_csFloatIn = TEXT("121");
	this->m_cs4ByteIn = TEXT("0x42F20000");
	this->UpdateData(FALSE);

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CFloatCalcDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialogEx::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CFloatCalcDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFloatCalcDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CFloatCalcDlg::OnBnClickedOk()
{
	CWnd* pWnd = GetFocus();
	if (GetDlgItem(IDOK) == pWnd)
	{
		// 取消默认的回车处理
		CDialogEx::OnOK();
		return;
	}
}


void CFloatCalcDlg::OnBnClickedCancel()
{
	CWnd* pWnd = GetFocus();
	if (GetDlgItem(IDCANCEL) == pWnd)
	{
		// 取消摩恩的ESC键处理
		CDialogEx::OnCancel();
		return;
	}
}


void CFloatCalcDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CDialog::OnOK();
	CDialogEx::OnClose();
}

void CFloatCalcDlg::addMsg(const TCHAR* pcMsg)
{
	do {
		if (NULL == pcMsg)
		{
			break;
		}

		if (_tcslen(pcMsg) > 0)
		{
			m_ctrlTip.SetSel(-1, -1, TRUE);
			m_ctrlTip.ReplaceSel(pcMsg);
		}
		else {
			// 如果给的文本为空字符串, 就说明要清空消息
			m_ctrlTip.SetSel(0, -1, TRUE);
			m_ctrlTip.ReplaceSel(TEXT(""));
		}

		// 加一个回车
		m_ctrlTip.SetSel(-1, -1, TRUE);
		m_ctrlTip.ReplaceSel(TEXT("\r\n"));

	} while (false);
}

void CFloatCalcDlg::OnBnClickedButtonFloatTo4bytes()
{
	byte ary[4];
	CString cs;
	CString csTmp;

	this->UpdateData(TRUE);
	addMsg(TEXT(""));
	addMsg(TEXT("浮点数转4字节"));

	float f = (float)_ttof(m_csFloatIn);
	uint32_t u = *(uint32_t*)&f;

	uint32_to_4byte(u, ary, 4);
	cs.Format(TEXT("0x%.2X%.2X%.2X%.2X"), ary[0], ary[1], ary[2], ary[3]);

	this->m_cs4ByteOut = cs;

	csTmp.Format(TEXT("%.2f to %s\r\n"), f, cs);
	addMsg(csTmp);

	this->UpdateData(FALSE);
}

void CFloatCalcDlg::uint32_to_4byte(uint32_t u, byte* ary, int aryLen)
{
	_ASSERT(NULL != ary);
	_ASSERT(aryLen >= 4);

	ary[0] = (byte)((u >> (8 * 3)) & 0xff);
	ary[1] = (byte)((u >> (8 * 2)) & 0xff);
	ary[2] = (byte)((u >> (8 * 1)) & 0xff);
	ary[3] = (byte)((u >> (8 * 0)) & 0xff);
}


void CFloatCalcDlg::OnBnClickedButton4bytesToFloat()
{
	CString cs;
	CString csTmp;
	uint32_t u;

	this->UpdateData(TRUE);
	addMsg(TEXT(""));
	addMsg(TEXT("4字节转浮点数"));

	cs = this->m_cs4ByteIn;
	cs.MakeUpper();

	if (cs.GetLength() >= 2)
	{
		if ((TEXT('0') == cs[0]) && ((TEXT('X') == cs[1])))
		{
			cs = cs.Right(cs.GetLength() - 2);
		}
	}

	do {
		// 12345678
		if (cs.GetLength() > 8)
		{
			addMsg(TEXT("err : 4字节最多8个16进制字符"));
			break;
		}

		if (!IsHexPsz((LPCTSTR)cs))
		{
			addMsg(TEXT("err : 请输入16进制字符串"));
			break;
		}

		while (cs.GetLength() < 8)
		{
			cs = _T("0") + cs;
		}

		Hex8CharToUint32((LPCTSTR)cs, u);
		this->m_csFloatOut.Format(TEXT("%.2f"), uint32_to_float(u));
		
		csTmp.Format(TEXT("%s to %s\r\n"), m_cs4ByteIn, this->m_csFloatOut);
		addMsg(csTmp);
	} while (false);

	this->UpdateData(FALSE);
}

float CFloatCalcDlg::uint32_to_float(uint32_t u)
{
	return (*(float*)&u);
}

void CFloatCalcDlg::Hex8CharToUint32(const TCHAR* pszHex8, uint32_t& u)
{
	unsigned char uc1;
	unsigned char uc2;

	_ASSERT(NULL != pszHex8);
	_ASSERT(8 == _tcslen(pszHex8));

	_ASSERT(NULL != pszHex8);
	_ASSERT(8 == _tcslen(pszHex8));

	uc1 = OneHexChar2UChar(pszHex8[0]);
	uc2 = OneHexChar2UChar(pszHex8[1]);
	
	u = uc1;
	u <<= 4;
	u += uc2;
	u <<= 4;

	uc1 = OneHexChar2UChar(pszHex8[2]);
	uc2 = OneHexChar2UChar(pszHex8[3]);

	u += uc1;
	u <<= 4;
	u += uc2;
	u <<= 4;

	uc1 = OneHexChar2UChar(pszHex8[4]);
	uc2 = OneHexChar2UChar(pszHex8[5]);

	u += uc1;
	u <<= 4;
	u += uc2;
	u <<= 4;

	uc1 = OneHexChar2UChar(pszHex8[6]);
	uc2 = OneHexChar2UChar(pszHex8[7]);

	u += uc1;
	u <<= 4;
	u += uc2;
}

unsigned char CFloatCalcDlg::OneHexChar2UChar(TCHAR c)
{
	unsigned char uc = 0;
	_ASSERT(((c >= TEXT('0')) && (c <= TEXT('9'))) || ((c >= TEXT('A')) && (c <= TEXT('F'))));

	if ((c >= TEXT('0')) && (c <= TEXT('9')))
	{
		uc = (unsigned char)(c - TEXT('0'));
	}
	else if ((c >= TEXT('A')) && (c <= TEXT('F')))
	{
		uc = (unsigned char)(c - TEXT('A') + 10);
	}

	return uc;
}

bool CFloatCalcDlg::IsHexPsz(const TCHAR* psz)
{
	int i = 0;
	TCHAR c = 0;
	bool b_ok = true;
	_ASSERT(NULL != psz);

	for (i = 0; i < (int)_tcslen(psz); i++)
	{
		c = psz[i];
		if (((c >= TEXT('0')) && (c <= TEXT('9'))) || (c >= TEXT('A')) && (c <= TEXT('F')))
		{

		}
		else {
			b_ok = false;
			break;
		}
	}

	return b_ok;
}

FloatCalcDlg.h


// FloatCalcDlg.h: 头文件
//

#pragma once


// CFloatCalcDlg 对话框
class CFloatCalcDlg : public CDialogEx
{
// 构造
public:
	CFloatCalcDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_FLOATCALC_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
	afx_msg void OnBnClickedCancel();
	afx_msg void OnClose();


private:
	void addMsg(const TCHAR* pcMsg);
	void uint32_to_4byte(uint32_t u, byte* ary, int aryLen);
	void Hex8CharToUint32(const TCHAR* pszHex8, uint32_t& u);
	bool IsHexPsz(const TCHAR* psz);
	unsigned char OneHexChar2UChar(TCHAR c);
	float uint32_to_float(uint32_t u);

public:
	CEdit m_ctrlTip;
	afx_msg void OnBnClickedButtonFloatTo4bytes();
	afx_msg void OnBnClickedButton4bytesToFloat();
	CString m_cs4ByteIn;
	CString m_cs4ByteOut;
	CString m_csFloatIn;
	CString m_csFloatOut;
};

rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#ifndef APSTUDIO_INVOKED
#include "targetver.h"
#endif
#include "afxres.h"
#include "verrsrc.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#ifndef APSTUDIO_INVOKED\r\n"
    "#include ""targetver.h""\r\n"
    "#endif\r\n"
    "#include ""afxres.h""\r\n"
    "#include ""verrsrc.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
    "#define _AFX_NO_OLE_RESOURCES\r\n"
    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
    "\r\n"
    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
    "LANGUAGE 4, 2\r\n"
    "#include ""res\\FloatCalc.rc2""  // 非 Microsoft Visual C++ 编辑的资源\r\n"
    "#include ""l.CHS\\afxres.rc""      // 标准组件\r\n"
    "#if !defined(_AFXDLL)\r\n"
    "#include ""l.CHS\\afxribbon.rc""   // MFC 功能区和控制条资源\r\n"
    "#endif\r\n"
    "#endif\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Icon
//

// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME           ICON                    "res\\FloatCalc.ico"


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "关于 FloatCalc"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
    LTEXT           "FloatCalc,版本 1.0",IDC_STATIC,42,14,114,8,SS_NOPREFIX
    LTEXT           "版权所有 (C) 2024",IDC_STATIC,42,26,114,8
    DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
END

IDD_FLOATCALC_DIALOG DIALOGEX 0, 0, 295, 131
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    CTEXT           "转换之前",IDC_STATIC,78,7,65,14,SS_CENTERIMAGE
    CTEXT           "转换之后",IDC_STATIC,149,7,65,14,SS_CENTERIMAGE
    CTEXT           "输入为浮点数",IDC_STATIC,7,29,65,14,SS_CENTERIMAGE
    EDITTEXT        IDC_EDIT_FLOAT_IN,78,29,65,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_4BYTES_OUT,149,29,65,14,ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "浮点数转4字节",IDC_BUTTON_FLOAT_TO_4BYTES,222,29,65,14,BS_CENTER | BS_VCENTER
    CTEXT           "输入为4字节",IDC_STATIC,7,49,65,14,SS_CENTERIMAGE
    EDITTEXT        IDC_EDIT_4BYTES_IN,78,49,65,14,ES_AUTOHSCROLL
    EDITTEXT        IDC_EDIT_FLOAT_OUT,149,49,65,14,ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "4字节转浮点数",IDC_BUTTON_4BYTES_TO_FLOAT,222,49,65,14,BS_CENTER | BS_VCENTER
    EDITTEXT        IDC_EDIT_TIP,7,69,281,55,ES_MULTILINE | ES_AUTOHSCROLL | ES_READONLY | ES_WANTRETURN
END


/////////////////////////////////////////////////////////////////////////////
//
// Version
//

VS_VERSION_INFO VERSIONINFO
 FILEVERSION 1,0,0,1
 PRODUCTVERSION 1,0,0,1
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x40004L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "080404B0"
        BEGIN
            VALUE "CompanyName", "TODO: <公司名>"
            VALUE "FileDescription", "FloatCalc"
            VALUE "FileVersion", "1.0.0.1"
            VALUE "InternalName", "FloatCalc.exe"
            VALUE "LegalCopyright", "TODO:  (C) <公司名>。  保留所有权利。"
            VALUE "OriginalFilename", "FloatCalc.exe"
            VALUE "ProductName", "TODO: <产品名>"
            VALUE "ProductVersion", "1.0.0.1"
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x804, 1200
    END
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_ABOUTBOX, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 163
        TOPMARGIN, 7
        BOTTOMMARGIN, 55
    END

    IDD_FLOATCALC_DIALOG, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 288
        VERTGUIDE, 78
        VERTGUIDE, 149
        VERTGUIDE, 222
        TOPMARGIN, 7
        BOTTOMMARGIN, 124
        HORZGUIDE, 29
        HORZGUIDE, 49
        HORZGUIDE, 69
    END
END
#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//

IDD_FLOATCALC_DIALOG AFX_DIALOG_LAYOUT
BEGIN
    0
END


/////////////////////////////////////////////////////////////////////////////
//
// String Table
//

STRINGTABLE
BEGIN
    IDS_ABOUTBOX            "关于 FloatCalc(&A)..."
END

#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include "res\FloatCalc.rc2"  // 非 Microsoft Visual C++ 编辑的资源
#include "l.CHS\afxres.rc"      // 标准组件
#if !defined(_AFXDLL)
#include "l.CHS\afxribbon.rc"   // MFC 功能区和控制条资源
#endif
#endif

/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED


END

汇编:简单计算器 汇编:简单计算器 实验目的: 通过本次实验,学习win32汇编程序设计。学习如何使用汇编语言进行windows界面编程.熟悉汇编的浮点数运算和三角函数操作.,学习如何在汇编语言中设计使用栈结构. 实验内容: 结合Windows界面编程,实现完善的计算器功能,支持浮点运算和三角函数等功能。 设计图 该图为计算机创建显示界面,处理消息,调用消息处理回调函数的总体框架. 在消息处理函数中按下相应键,进入相应的处理模块.比如按下数字键进入pressNumBunton模块. 实验过程: 界面资源设计 1.右键资 阅读详情

相关推荐

ArcGIS栅格计算器浮点运算精度问题解决方案

在GIS数据处理中,栅格计算是基础而重要的操作,涉及地形分析、遥感影像处理等多个领域。栅格数据分为整型和浮点型两种,其中浮点运算能保留更高精度,但ArcGIS栅格计算器默认会根据输入数据类型确定输出类型,这可能导致精度丢失。特别是在进行开三次方等非线性运算时,整型输出会截断小数部分,造成结果异常。通过强制指定浮点输出、预处理数据类型或使用Python栅格库等方法,可以有效解决这一问题。这些技巧在地形湿度指数计算、植被指数转换等场景中尤为重要,能确保多步骤计算的中间结果精度不丢失。

weixin_33212799的博客 310

浮点数在线转hex计算器

浮点数在线转hex计算器

key12315的专栏 1万+

浮点数进制计算器工具

该工具使用Python代码实现了浮点数进制的转换,包括浮点数到二进制、二进制到浮点数、浮点数到十六进制以及十六进制到浮点数的转换。首先,我们将其转换为二进制表示,并打印出结果。然后,我们将二进制字符串"1101.011"转换为浮点数,并打印出结果。上述代码实现了四个函数,分别用于将浮点数转换为二进制、将二进制转换为浮点数、将浮点数转换为十六进制以及将十六进制转换为浮点数。函数将浮点数转换为十六进制字符串,并去除字符串中的前缀"0x"。函数将浮点数转换为二进制字符串,并去除字符串中的前缀"0b"。

WdJavascript的博客 2421

浮点数-Float-Double转二进制在线工具

浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。浮点数,是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学计数法。在线单双精度(Float,Double)浮点数转二进制。

Linux,Java,SpringBoot,Python,Lua略知一点 1万+

Float与Double进制转换工具

在某些情况下,我们可能需要将浮点数在不同的进制之间进行转换,例如从十进制转换为二进制或十六进制。然后,将二进制表示拆分为整数部分和小数部分,并分别将它们转换为十六进制字符串。在转换小数部分时,将二进制字符串按照每4位进行分组,并将每组转换为对应的十六进制数字。最后,将整数部分和小数部分拼接起来,并在整个十六进制表示前加上符号位。最后,将整数部分和小数部分拼接起来,并在整个二进制表示前加上符号位。函数首先判断浮点数的符号,然后将浮点数拆分为整数部分和小数部分。,分别用于将浮点数转换为二进制和十六进制表示。

WdJavascript的博客 1559

高精度计算器 - 浮点数的精确计算与实现

在信息科技的浪潮中,高精度计算器已成为解决特定计算需求的重要工具。高精度计算器,顾名思义,指能够处理超出标准数据类型(如float、double)精度限制的计算工具。它可以执行从简单的加减乘除到复杂的数学函数计算,且具有极高的准确性。

weixin_42323064的博客 940

在线IEEE浮点二进制计算器工具

在线IEEE浮点二进制计算器工具,支持binary16,binary32,binary64,binary128 在线IEEE浮点二进制计算器工具 这是一个小计算器,旨在帮助您了解用于浮点计算的IEEE 754标准。它是用JavaScript实现的,并且可以与Chrome和Firefox的最新桌面版本一起使用。我尚未在其他浏览器上进行过测试。如果您在左侧的三个框中之一中输入浮点数字,然后按Enter键,您将在右侧看到该数字的位模式。您可以输入使用通常在编程语言接受的语法,比如数字42,2.345,12E-3

Linux,Java,SpringBoot,Python,Lua略知一点 7639

Java计算器:整型与浮点型的完美结合

在Java编程中,整型和浮点型是基本的数据类型,用于存储数值。整型分为byte、short、int和long,而浮点型则包含float和double。这些类型各有特点,适用于不同的场景。方法是定义在类内部的代码块,它封装了一段逻辑,并通过方法名来调用。

weixin_36197669的博客 735

Python BMI计算器:从入门到工程化,避开浮点精度与输入校验的坑

浮点数精度和输入校验是编程入门中的常见挑战,尤其在处理用户输入时,异常值如nan、inf和全角字符可能导致程序崩溃或结果错误。理解浮点数的IEEE 754表示和输入验证原理,能显著提升代码的健壮性。在工程实践中,防御性编程和边界处理技术价值巨大,可应用于数据清洗、表单验证等场景。本文以Python BMI计算器为例,深入探讨浮点数精度处理、输入校验和边界判定等细节,并融入对nan和inf等特殊值的处理,帮助读者从能跑代码进阶到敢给别人用。

weixin_31236101的博客 246

4字节浮点数计算工具1.01 .exe

4字节浮点数计算工具

MAX96712解串器MIPI CSI-2输出配置全解析:从Video Pipe映射到DPLL速率设置(以4路YUV422摄像头为例)

本文详细解析了MAX96712解串器在MIPI CSI-2输出配置中的关键步骤,包括Video Pipe映射、寄存器配置和DPLL速率设置。通过具体示例和代码片段,帮助开发者优化4路YUV422摄像头系统的图像传输稳定性和画质表现,适用于汽车电子和工业视觉应用。

weixin_30776273的博客 433

原生JS实现计算器、进制转换与BMI三合一工具

在前端工具类应用中,计算器、进制转换和BMI计算常被拆成独立入口,真正的工程难点并不在公式,而在表达式求值、浮点精度、状态机与输入边界校验。双栈法四则运算可规避 eval 的精度和安全风险;进制转换在安全整数范围内可用 parseInt/toString,超出后切到 BigInt,小数部分通过乘基取整并设置位数上限;BMI 计算需固定分级边界、统一单位并对异常输入兜底。原生 JS、无框架单文件与模块懒初始化降低打开成本和维护成本,再配合移动端触控目标、16px 输入字号和断网可用性检查,更符合长期使用的轻量

weixin_27943395的博客 210

SIwave学习记录:电热耦合仿真

SIwave电热耦合仿真

m0_68174736的博客 2336

浮点运算计算机在线,MFC实现浮点计算器

简介VS2019编写的计算器,支持括号和小数运算和进制转换当进制发生转换时,如果表达式框内有表达式,会计算后转化,支持小数转换,如果表达式有误,将直接清空。界面实现方法表达式框添加控制变量CString类型的m_sEquation,除了求值运算其他按键都可以认为是对字符串的操作下面重点介绍值的运算,为此写了一个MyCalculator类,它有两个成员函数:bool MyCalculator::Ca...

weixin_33026067的博客 1346

GJB软件需求规格说明-编制指南

《软件需求规格说明》是软件开发过程必不可少的文档,并且需要评审,也是后续鉴定试验的依据,因此,非常有必要认真对待此文档。 文档对于很多开发技术人员来说是一件非常头疼的事,虽然标准有要求,但是光看标准还是难以下笔。 本文将详细讲解如何按照GJB 438C的要求编写《软件需求规格说明》。 注:文中有背景颜色内容为标准内容,加粗部分为范例。斜体部分为解释。 全文1.3万字

Abel的博客 6361

**Coffin-Manson 模型**在半导体功率循环测试中的理论背景、数学形式、应用场景,以及如何使用 **C#** 编程语言进行具体实现

Coffin-Manson 模型最初用于描述金属材料在低周疲劳(Low-Cycle Fatigue, LCF)下的寿命,后来被广泛应用于半导体功率器件(如 IGBT、MOSFET)的可靠性分析,特别是在功率循环测试中。如果你有具体数据(如 CSV 文件)、更复杂的模型要求(如 Bayerer 模型)或特定可视化需求,请提供,我可以进一步优化代码或添加功能!以下代码实现基本模型 ( N_f = A \cdot (\Delta T_j)^{-n} ) 的拟合,生成拟合曲线并预测寿命。我会结合你之前提到的。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 481

C++实现一个简单的浮点计算器

C++实现一个简单的浮点中缀表达式 计算使用到了栈,边转换边计算,不是先转为后缀表达式再计算 #include<iostream> #include<stack> #include<string> using namespace std; stack<char> c; stack<double> n; string ans = ""; double a, b, res;//全局变量 double calculate(double a, double

luodeng_的博客 1517

【Autoware】2小时安装Autoware1.13(保姆级教程)

Autoware是一款“一体化”开源自动驾驶软件,能实现感知、决策、控制等功能,通过在Ubuntu中搭建Autoware开发环境和案例的运行,使大家对自动驾驶技术的实现有一个更清晰的认识。

DevFrank的博客 1万+

双浮点运算计算机在线,双浮点运算计算器

该楼层疑似违规已被系统折叠隐藏此楼查看此楼双字换算计算机双浮点运算计算器初始数值:双字数值:var button = window.document.getElementById("calculate");var result = window.document.getElementById("result");button.onclick = gogogo;function checkNum(...

weixin_32896083的博客 4096

AIGC实战——多模态模型DALL.E 2

DALL.E 2 是 OpenAI 提出的一个大规模文本生成图像模型,可以根据文本提示生成各种风格的逼真图像。它通过将预训练模型 CLIP 与 GLIDE 中的扩散模型架构相结合完成任务。它还具有其他应用,例如通过文本提示编辑图像和提供给定图像的变体。虽然它也有一些局限性,例如不一致的文本渲染和属性绑定,但 DALL.E 2 是仍然一个非常强大的AI模型,推动了生成模型的发展。

盼小辉丶的博客 1万+

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

【数据集】3D-GloBFP:全球首个三维建筑轮廓数据集

WW、forever的博客 1690

浮点数运算计算机在线,双浮点运算计算器

该楼层疑似违规已被系统折叠隐藏此楼查看此楼双字换算计算机双浮点运算计算器初始数值:双字数值:var button = window.document.getElementById("calculate");var result = window.document.getElementById("result");button.onclick = gogogo;function checkNum(...

weixin_35049411的博客 2809

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

m0_51579041的博客 1万+

shell中浮点数值计算

一、shell中数值计算方法 shell中常用的数值计算方法是使用运算符号:$(()) 例如,使用命令: echo $((5*6+1)) 即会得到正确的计算结果。但是该方法存在的问题是不能对浮点数进行操作,如下: 可以看到当使用该运算符进行浮点数运算时会出错。 二、shell中浮点数计算方法 shell中浮点数计算主要有两个方法可以使用。 1、bc计算器 bc实际上是一种编程语言,该语言允许在命令行输入浮点表达式,然后执行,通常在linux下被用作计算器,提供常用的数学计算,包括: + :加法 - :

HelloWorldTM的博客 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: debug - 打补丁 - 浮点数加法
下一篇: debug - 只要在内存中有显示相关的数据, 就会被CE找到
LostSpeed
博客等级 码龄18年 4652粉丝 1681原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值