⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 floattooldlg.cpp

📁 研究浮点运算的工具。在汇编下研究使用浮点运算
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// FloatToolDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "FloatTool.h"
#include "FloatToolDlg.h"
#include <cmath>

using namespace std;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CFloatToolDlg 对话框

CFloatToolDlg::CFloatToolDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFloatToolDlg::IDD, pParent)
	, m_BinHigh(_T(""))
	, m_Type(0)
	, m_hdbInputVal(0)
	, m_fInputVal(0)
	, m_dInputVal(0)
	, m_ldInputVal(0)
	, m_SignBit(_T(""))
	, m_DecMantissa(_T(""))
	, m_HexMantissa(_T(""))
	, m_DecExponent(_T(""))
	, m_HexExponent(_T(""))
	, m_HideBit(_T(""))
	, m_Size(4)
	, m_OutputType(CFloatToolDlg::HEX)
	, m_2Exponent(_T(""))
	, m_2Mantissa(_T(""))
	, m_Seperator(CFloatToolDlg::NO_SEPERATOR)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CFloatToolDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_INPUT_STR, m_InputStr);
	DDX_Text(pDX, IDC_EDIT1, m_SignBit);
	DDX_Text(pDX, IDC_EDIT3, m_DecMantissa);
	DDX_Text(pDX, IDC_EDIT7, m_HexMantissa);
	DDX_Text(pDX, IDC_EDIT2, m_DecExponent);
	DDX_Text(pDX, IDC_EDIT6, m_HexExponent);
	DDX_Text(pDX, IDC_EDIT9, m_HideBit);
	DDX_Control(pDX, IDC_OUTPUT_LABEL, m_OutputLabel);
	DDX_Control(pDX, IDC_OUT_BIN2, m_OutputStr);
	DDX_Text(pDX, IDC_EDIT10, m_2Exponent);
	DDX_Text(pDX, IDC_EDIT8, m_2Mantissa);
}

BEGIN_MESSAGE_MAP(CFloatToolDlg, CDialog)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_EN_CHANGE(IDC_INPUT_STR, OnEnChangeInputStr)
	ON_BN_CLICKED(IDC_HEX, OnBnClickedHex)
	ON_BN_CLICKED(IDC_FLOAT, OnBnClickedFloat)
	ON_BN_CLICKED(IDC_DEC, OnBnClickedDec)
	ON_BN_CLICKED(IDC_DOUBLE, OnBnClickedDouble)
	ON_BN_CLICKED(IDC_LONG_DOUBLE, OnBnClickedLongDouble)
	ON_BN_CLICKED(IDC_BIN, OnBnClickedBin)
	ON_BN_CLICKED(IDC_SIZE2, OnBnClickedSize2)
	ON_BN_CLICKED(IDC_SIZE4, OnBnClickedSize4)
	ON_BN_CLICKED(IDC_SIZE6, OnBnClickedSize6)
	ON_BN_CLICKED(IDC_SIZE8, OnBnClickedSize8)
	ON_BN_CLICKED(IDC_SIZE10, OnBnClickedSize10)
	ON_BN_CLICKED(IDC_SIZE16, OnBnClickedSize16)
	ON_BN_CLICKED(IDC_HEX2, OnBnClickedHex2)
	ON_BN_CLICKED(IDC_FLOAT2, OnBnClickedFloat2)
	ON_BN_CLICKED(IDC_DEC2, OnBnClickedDec2)
	ON_BN_CLICKED(IDC_DOUBLE2, OnBnClickedDouble2)
	ON_BN_CLICKED(IDC_LONG_DOUBLE2, OnBnClickedLongDouble2)
	ON_BN_CLICKED(IDC_BIN2, OnBnClickedBin2)
	ON_WM_CHAR()
	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
	ON_BN_CLICKED(ID_CLEAR_INPUT, OnBnClickedClearInput)
	ON_BN_CLICKED(IDC_QUIT, OnBnClickedQuit)
	ON_BN_CLICKED(IDC_NO_SEPERATOR, OnBnClickedNoSeperator)
	ON_BN_CLICKED(IDC_SPACE_SEPERATOR, OnBnClickedSpaceSeperator)
	ON_BN_CLICKED(IDC_COMMA_SEPERATOR, OnBnClickedCommaSeperator)
END_MESSAGE_MAP()


// CFloatToolDlg 消息处理程序

BOOL CFloatToolDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

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

	CButton  *pchk = (CButton *)GetDlgItem(IDC_HEX);
	pchk->SetCheck(BST_CHECKED);
	pchk = (CButton *)GetDlgItem(IDC_SIZE4);
	pchk->SetCheck(BST_CHECKED);
	pchk = (CButton *)GetDlgItem(IDC_HEX2);
	pchk->SetCheck(BST_CHECKED);
	pchk = (CButton *)GetDlgItem(IDC_NO_SEPERATOR);
	pchk->SetCheck(BST_CHECKED);
	m_InputStr.SetFocus();
	// TODO: 在此添加额外的初始化代码
	
	return FALSE;  // 除非设置了控件的焦点,否则返回 TRUE
}

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

void CFloatToolDlg::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
	{
		CDialog::OnPaint();
	}
}

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

void CFloatToolDlg::OnEnChangeInputStr()
{
	Convert();
}

void CFloatToolDlg::OnBnClickedHex()
{
	m_Type = CFloatToolDlg::HEX;
	Convert();
}

void CFloatToolDlg::OnBnClickedFloat()
{
	m_Type = CFloatToolDlg::FLOAT;
	Convert();
}

void CFloatToolDlg::OnBnClickedDec()
{
	m_Type = CFloatToolDlg::DEC;
	Convert();
}

void CFloatToolDlg::OnBnClickedDouble()
{
	m_Type = CFloatToolDlg::DOUBLE;
	Convert();
}

void CFloatToolDlg::OnBnClickedLongDouble()
{
	m_Type = CFloatToolDlg::LONG_DOUBLE;
	Convert();
}

void CFloatToolDlg::OnBnClickedBin()
{
	m_Type = CFloatToolDlg::BIN;

	Convert();
}

//UINT64 Bin2Dec64(UINT64 binVal) 
//{
//	UINT64 sum = 0;
//	for (int i = 0;  i < 52; i++)	
//	{
//		if ((binVal >> i) & 1)
//		{
//			sum += pow(2.0, i);
//		}
//	}
////	sum /= pow((int)2, (int)23);
//	sum += pow(2.0, 52);
//	return sum;	
//}
/*
SHASM Floating Point Data Blocks

The following table shows the operation size specified by floating point range.

Type			Single-Precision					Double Precision 
sNaN			7FFFFFFF to 7FC00000		7FFFFFFF FFFFFFFF to 7FF80000 00000000 
qNaN			7FBFFFFF to 7F800001		7FF7FFFF FFFFFFFF to 7FF00000 00000001 
+Infinity		7F800000					7FF00000 00000000 
+Normalized		7F7FFFFF to 00800000		7FEFFFFF FFFFFFFF to 00100000 00000000 
+Denormalized	007FFFFF to 00000001		000FFFFF FFFFFFFF to 00000000 00000001 
+Zero			00000000					00000000 00000000 
-Zero			80000000					80000000 00000000 
-Denormalized	80000001 to 807FFFFF		80000000 00000001 to 800FFFFF FFFFFFFF 
-Infinity		FF800000					FFF00000 00000000 
qNaN			FF800001 to FFBFFFFF		FFF00000 00000001 to FFF7FFFF FFFFFFFF 
sNaN			FFC00000 to FFFFFFFF		FFF90000 00000000 to FFFFFFFF FFFFFFFF 
*/

void CFloatToolDlg::GenOutput(void)
{
	tostringstream ostr;
	int exp;
	UINT64 tmp64;
	UINT64 mant;
	ClearFloatStr();
	switch(m_OutputType)
	{
		case CFloatToolDlg::HEX :
		{
			ostr<< hex ;
			ostr<< uppercase << setw(m_Size * 2) << setfill(_T('0')) ;
			m_OutputLabel.SetWindowText(_T("Hex 输出"));
			switch(m_Size)
			{
			case 2:
				{
					ostr<< m_m128.m128i.m128i_u16[0];
					break;
				}
			case 4:
				{
					ostr<< m_m128.m128i.m128i_u32[0];
					break;
				}
			//case 6:
			//{
			//		ostr<< m_m128.m128i.
			//	break;
			//}
			case 8:
				{
					ostr<< m_m128.m128i.m128i_u64[0];
					break;
				}
			case 10:
				{
					ostr<< m_BigInt.ItoA(CBigInt::HEX, 10);
					break;
				}
			case 16:
				{
					ostr<< m_BigInt.ItoA(CBigInt::HEX, 16);
					break;
				}
			default:
				AddError(ERR_SWITCH_DEFAULT);
				break;
			}
			break;
		}
	case CFloatToolDlg::DEC :
		{
			ostr<< dec ;
			m_OutputLabel.SetWindowText(_T("Dec 输出"));
			switch(m_Size)
			{
			case 2:
				{
					ostr<< m_m128.m128i.m128i_i16[0];
					break;
				}
			case 4:
				{
					ostr<< m_m128.m128i.m128i_i32[0];
					break;
				}
			//case 6:
				//{
				//		ostr<< m_m128.m128i.
				//	break;
				//}
			case 8:
				{
					ostr<< m_m128.m128i.m128i_i64[0];
					break;
				}
			case 10:
				{
					ostr<< m_BigInt.ItoA(CBigInt::DEC, 10);
					break;
				}
			case 16:
				{
					ostr<< m_BigInt.ItoA(CBigInt::DEC, 16);
					break;
				}
			default:
				AddError(ERR_SWITCH_DEFAULT);	
			}
			break;
		}
	case CFloatToolDlg::BIN :
		{
			if (m_Size < 9)
			{
				for ( int i = m_Size*8-1; i >= 0; i--)
				{
					if (m_m128.m128i.m128i_u32[i/32] & (1 << (i%32)) )
					{
						ostr<< _T("1");
					}
					else
					{
						ostr<< _T("0");
					}
				}
			}
			else
				ostr<< m_BigInt.ItoA(CBigInt::BIN, m_Size);

			break;
		}
	case CFloatToolDlg::FLOAT :
		{
			ostr<< scientific <<  showpoint << showpos << setprecision(18);
			m_OutputLabel.SetWindowText(_T("float 输出"));
			ostr<< m_m128.m128f.m128_f32[0];
//			tmpf = m_m128.m128f.m128_f32[0];

			if (m_m128.m128i.m128i_u32[0] & 0X80000000)
			{
				m_SignBit = _T("1");
			}
			else
			{
				m_SignBit = _T("0");
			}

			exp = (m_m128.m128i.m128i_u32[0] >> 23)  & 0XFF;
			mant = m_m128.m128i.m128i_u32[0] & 0X7FFFFF;
			m_DecExponent.Format(_T("%d"), exp);
			m_HexExponent.Format(_T("%02X"), exp );

			m_DecMantissa.Format(_T("%d"), mant);
			m_HexMantissa.Format(_T("%06X"), mant);
			if (exp == 0 && mant == 0)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp  );
				m_2Mantissa.Format(_T("%d"), mant);
			}
			if (exp == 0 && mant != 0)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp - 0X7F + 1);
				m_2Mantissa.Format(_T("%d/8388608"), mant);
			}
			if (exp == 0XFF && mant == 0)
			{	
				m_2Exponent.Format(_T("2^(%d)"), exp);
				m_2Mantissa.Format(_T("Infinite"));
			}
			if (exp == 0XFF && mant != 0)
			{
				if ( (mant & 0X400000 ) == 0X400000)
				{
					m_2Exponent.Format(_T("2^(%d)_T("), exp  );
					m_2Mantissa.Format(_T("SNAN"));
				}
				else
				{
					m_2Exponent.Format(_T("2^(%d)"), exp  );
					m_2Mantissa.Format(_T("QNAN"));
				}
			}

			if ( exp >= 1 && exp <= 0XFE)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp - 0X7F );
				m_2Mantissa.Format(_T("%d/8388608"), mant | 0X800000);
			}
			//m_2Mantissa.Format(_T("%d"), Bin2Dec32(m_m128.m128i.m128i_u32[0] & 0X7FFFFF));
			break;
		}
	case CFloatToolDlg::DOUBLE :
		{
			ostr<< scientific <<  showpoint << showpos << setprecision(18);
			m_OutputLabel.SetWindowText(_T("double 输出"));
			ostr<< m_m128.m128d.m128d_f64[0];
			
			tmp64 =  m_m128.m128i.m128i_u64[0];

			if (tmp64 & 0X8000000000000000)
			{
				m_SignBit = _T("1");
			}
			else
			{
				m_SignBit = _T("0");
			}

			exp = (tmp64 >> 52) & 0X7FF;
			mant = tmp64 & 0XFFFFFFFFFFFFF;
			m_DecExponent.Format(_T("%d"), exp);
			m_HexExponent.Format(_T("%03X"), exp );

			m_DecMantissa.Format(_T("%d"), mant);
			m_HexMantissa.Format(_T("%013X"), mant);
			if (exp == 0 && mant == 0)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp  );
				m_2Mantissa.Format(_T("%I64d"), mant);
			}
			if (exp == 0 && mant != 0)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp - 0X3FF + 1);
				m_2Mantissa.Format(_T("%I64d/4503599627370496"), mant);
			}
			if (exp == 0X7FF && mant == 0)
			{	
				m_2Exponent.Format(_T("2^(%d)"), exp);
				m_2Mantissa.Format(_T("Infinite"));
			}
			if (exp == 0X7FF && mant != 0)
			{
				if ( (mant & 0X8000000000000 ) == 0X8000000000000)
				{
					m_2Exponent.Format(_T("2^(%d)"), exp  );
					m_2Mantissa.Format(_T("SNAN"));
				}
				else
				{
					m_2Exponent.Format(_T("2^(%d)"), exp  );
					m_2Mantissa.Format(_T("QNAN"));
				}
			}

			if ( exp >= 1 && exp <= 0X7FE)
			{
				m_2Exponent.Format(_T("2^(%d)"), exp - 0X3FF );
				m_2Mantissa.Format(_T("%I64d/4503599627370496"), mant | 0X10000000000000);
			}
			break;
		}
	case CFloatToolDlg::LONG_DOUBLE : 
		{

			break;
		}
	default:
			AddError(ERR_SWITCH_DEFAULT);	
	}
	OutputResult(ostr.str());
	UpdateData(FALSE);
}

void CFloatToolDlg::OnBnClickedSize2()
{
	m_Size = 2;
	Convert();
}

void CFloatToolDlg::OnBnClickedSize4()
{
	m_Size = 4;
	Convert();
}

void CFloatToolDlg::OnBnClickedSize6()
{
	m_Size = 6;

	Convert();
}

void CFloatToolDlg::OnBnClickedSize8()
{
	m_Size = 8;
	Convert();
}

void CFloatToolDlg::OnBnClickedSize10()
{
	m_Size = 10;

	Convert();
}

void CFloatToolDlg::OnBnClickedSize16()
{
	m_Size = 16;

	Convert();
}

void CFloatToolDlg::OnBnClickedHex2()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -