提交 0bd17948 创建 作者: 赵鹏翀's avatar 赵鹏翀

init template

上级
/Debug
/Release
<?xml version="1.0" encoding="gb2312"?>
<ASMProject Version="1.00" Name="Lab003" TemplatePath="console(c)\Project" ProjectID="c793b563-74d2-4f29-80c8-adf61f6de46b" IsSubmitWork="0">
<Configurations>
<Configuration Name="Debug" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="_DEBUG" GenerateDebugInformation="-1" LanguageStandard="c99"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
<Configuration Name="Release" DebuggerFlavor="0">
<Tool Name="PreBuildEventTool"/>
<Tool Name="CustomBuildTool"/>
<Tool Name="GCCCompilerTool" PreprocessorDefinitions="NDEBUG" LanguageStandard="c99"/>
<Tool Name="PreLinkEventTool"/>
<Tool Name="GCCLinkerTool" StripDebugInfo="-1"/>
<Tool Name="PostBuildEventTool"/>
</Configuration>
</Configurations>
<Files>
<Filter Name="ͷļ" Filter="h;hpp;hxx">
<File RelativePath=".\console.h">
</File>
</Filter>
<Filter Name="Դļ" Filter="cpp;c;cc;cxx">
<File RelativePath=".\console.c">
</File>
</Filter>
</Files>
</ASMProject>
添加文件
/* 定义控制台应用程序的入口点 */
#include "console.h"
typedef unsigned int float_bits;
#define TMin 0x80000000
float_bits float_half(float_bits fb) // 求一个数的一半
{
unsigned long sign = fb >> 31;
unsigned long exp = fb >> 23 & 0xff;
unsigned long frac = fb & 0x7fffff;
if (exp == 0xff)
return fb;
if (exp > 0)
{
exp--;
if (exp == 0)
frac += 1 << 23;
}
else if (exp == 0)
{
if ((frac & 0x3) == 0x3)
frac = (frac >> 1) + 1;
else
frac >>= 1;
}
return ((sign << 31) | (exp << 23) | frac);
}
float_bits float_i2f(int i) // 将int型整数i的位序列转换为float型位序列
{
unsigned long sign, exp, frac, last_bit;
sign = i >> 31;
if (i == TMin) //处理i为最小负数的时候
{
exp = 158;
frac = 0;
}
else if (i == 0) //处理i为0
{
exp = 0;
frac = 0;
}
else
{
if (sign) //如果i为负数,需要求其原码
frac = (~i + 1) << 1;
else
frac = i << 1;
exp = 0;
while (!(frac & 0x80000000))
{
exp++;
frac <<= 1;
}
exp = 157 - exp;
last_bit = ((frac >> 8) & 1);
if (!last_bit) //处理舍入,对于最后1位为0
{
if ((frac & 0xff) == 0x80 || !((frac & 0xff) & 0x80)) //舍弃的位离0更近
frac = ((frac << 1) >> 9);
else
frac = ((frac << 1) >> 9) + 1;
}
else //处理舍入,对于最后1位为1
{
if ((frac & 0xff) == 0x80 || ((frac & 0xff) & 0x80)) //舍弃的位离1更近
{
frac = ((frac << 1) >> 9) + 1;
if (frac & 0x800000)
{
exp++;
frac = 0;
}
}
else
frac = ((frac << 1) >> 9);
}
}
return ((sign << 31) | (exp << 23) | frac);
}
// ****************************************************************************
int isNan(float_bits fb)
{
// 此处将代码补充完整
// 函数的功能是:判断fb是否为非数,是则返回1,否则返回0
return 0;
}
float_bits float_abs(float_bits fb)
{
// 此处将代码补充完整
// 函数的功能是:求绝对值
return 0;
}
float_bits float_neg(float_bits fb)
{
// 此处将代码补充完整
// 函数的功能是:求相反数
return 0;
}
float_bits float_twice(float_bits fb)
{
// 将代码补充完整
// 函数的功能是:求一个数的2倍
return 0;
}
int float_f2i(float_bits fb)
{
// 将代码补充完整
// 程序的功能是:将浮点数f的位序列转换为int型位序列
return 0;
}
// ****************************************************************************
int main(int argc, char* argv[])
{
// 求绝对值
printf("计算浮点数f的绝对值|fb|。若fb为NaN,则返回fb,否则返回|fb|\n");
unsigned long Value = 0x83fffff3; // 最高位是1,表示其为负数
unsigned long Temp = float_abs(Value);
printf("The Value is 0x%x 负数, float_abs(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x7fffffff; // NaN
Temp = float_abs(Value);
printf("The Value is 0x%x 非数, float_neg(0x%x) = 0x%x\n\n", Value, Value, Temp);
// 求负数
printf("计算浮点数f的负数-fb。若fb为NaN,则返回fb,否则返回-fb\n");
Value = 0x3fffff3; // 将求绝对值的结果作为求负数的参数0x3fffff3
Temp = float_neg(Value);
printf("The Value is 0x%x 正数, float_neg(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x7fffffff; // NaN
Temp = float_neg(Value);
printf("The Value is 0x%x 非数, float_neg(0x%x) = 0x%x\n\n", Value, Value, Temp);
// 求一个数的一半
printf("计算0.5*fb。若fb为NaN,则返回fb,否则返回0.5*fb\n");
Value = 0x83fffff3; // 乘以0.5后,阶码由7变为6
Temp = float_half(Value);
printf("The Value is 0x%x 负数, float_half(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x7fffffff; // 传入参数是一个NaN,则返回原值
Temp = float_half(Value);
printf("The Value is 0x%x 非数, float_half(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x807ffff3; // 非规格化数
Temp = float_half(Value);
printf("The Value is 0x%x 非规格化数, float_half(0x%x) = 0x%x\n\n", Value, Value, Temp);
// 将int型整数i的位序列转换为float型位序列。
printf("将int型整数i的位序列转换为float型位序列\n");
Value = 0x3fbfff70; // 规格化非零正数
int j = (int)Value;
Temp = float_i2f(j);
printf("The Value is 0x%x 规格化非零正数, float_i2f(0x%x) = 0x%x\n", Value, j, Temp);
Value = 0x80000000; // 负0
j = (int)Value;
Temp = float_i2f(j);
printf("The Value is 0x%x, float_i2f(0x%x) = 0x%x\n", Value, j, Temp);
Value = 0x0; // 正0
j = (int)Value;
Temp = float_i2f(j);
printf("The Value is 0x%x, float_i2f(0x%x) = 0x%x\n\n", Value, j, Temp);
// 求一个数的2倍
printf("计算2.0*fb。若fb为NaN,则返回fb,否则返回2.0*fb\n");
Value = 0x83fffff3; // 乘以2后,阶码由7变为8
Temp = float_twice(Value);
printf("The Value is 0x%x 负数, float_twice(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x7fffffff; // 传入参数是一个NaN,则返回原值
Temp = float_twice(Value);
printf("The Value is 0x%x 非数, float_twice(0x%x) = 0x%x\n", Value, Value, Temp);
Value = 0x807ffff3; // 非规格化数
Temp = float_twice(Value);
printf("The Value is 0x%x 非规格化数, float_twice(0x%x) = 0x%x\n\n", Value, Value, Temp);
// 将浮点数f的位序列转化为int型位序列。
printf("将浮点数f的位序列转换为int型位序列\n");
Value = 0x83fffff3; // f为规格化数, 返回0
float f = *(float *)&Value;
int f2iTemp = float_f2i(Value);
printf("The Value is 0x%x %f 非规格化数, float_f2i(0x%x) = 0x%x\n", Value, f, Value, f2iTemp);
Value = 0x7fffffff; // f是NaN,则返回0x80000000
f = *(float *)&Value;
f2iTemp = float_f2i(Value);
printf("The Value is 0x%x %f 非数, float_f2i(0x%x) = 0x%x\n", Value, f, Value, f2iTemp);
Value = 0x3fbfff70; // 规格化非零正数
f = *(float *)&Value;
f2iTemp = float_f2i(Value);
printf("The Value is 0x%x %f 规格化非零正数, float_f2i(0x%x) = 0x%x\n", Value, f, Value, f2iTemp);
Value = 0xcf000000; // 超出int范围
f = *(float *)&Value;
f2iTemp = float_f2i(Value);
printf("The Value is 0x%x %f 超出int范围, float_f2i(0x%x) = 0x%x\n", Value, f, Value, f2iTemp);
}
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include <stdio.h>
/* TODO: 在此处引用程序需要的其他头文件 */
#endif /* _CONSOLE_H_ */
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论