Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
L
Lab003
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
问题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
银宸时代
CS Lab Group
实验项目模板
实验模板
Lab003
提交
0bd17948
提交
0bd17948
12月 13, 2018
创建
作者:
赵鹏翀
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
init template
上级
隐藏空白字符变更
内嵌
并排
正在显示
5 个修改的文件
包含
264 行增加
和
0 行删除
+264
-0
.gitignore
.gitignore
+2
-0
Lab003.csproj
Lab003.csproj
+31
-0
Lab003.puo
Lab003.puo
+0
-0
console.c
console.c
+222
-0
console.h
console.h
+9
-0
没有找到文件。
.gitignore
0 → 100644
浏览文件 @
0bd17948
/Debug
/Release
Lab003.csproj
0 → 100644
浏览文件 @
0bd17948
<?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>
Lab003.puo
0 → 100644
浏览文件 @
0bd17948
添加文件
console.c
0 → 100644
浏览文件 @
0bd17948
/* 定义控制台应用程序的入口点 */
#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
);
}
console.h
0 → 100644
浏览文件 @
0bd17948
#ifndef _CONSOLE_H_
#define _CONSOLE_H_
#include <stdio.h>
/* TODO: 在此处引用程序需要的其他头文件 */
#endif
/* _CONSOLE_H_ */
编写
预览
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论