📄 floattooldlg.cpp
字号:
// 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 + -