#include "../include/FixedPointCal.h"
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
FixedPointCal::FixedPointCal(void)
{
}
FixedPointCal::~FixedPointCal(void)
{
}
void FixedPointCal::change(int type, float a, Ftype* A)
{
if(type == TYPE_FLOAT )
{
A[0] = a;
return ;
}
else if(type == TYPE_FIXEDPOINT)
{
int zs,flag;
float xs;
if(a<0) {flag=1;a=-a;}else flag=0;
zs=(int)(a);
xs=a-zs;
int i=FixedPoint_zs;
while(zs!=0)
{
A[i]=zs%2;
zs=zs/2;
i--;
}
i=FixedPoint_zs+1;
int temp;
while((xs!=0)&&(i<FixedPoint_all))
{
xs=xs*2;
temp=(int)(xs);
A[i]=temp;
xs=xs-temp;
i++;
}
A[0]=flag;
}
}
void FixedPointCal::rechange(int type, float* a, const Ftype* A)
{
if(type == TYPE_FLOAT)
{
*a = A[0];
return;
}
else if(type == TYPE_FIXEDPOINT)
{
int i;
int zs=0;
float xs=0;
for(i=FixedPoint_all-1;i>FixedPoint_zs;i--)
{
xs=xs+A[i];
xs/=2.0;
}
for(i=1;i<FixedPoint_zs;i++)
{
zs=zs+A[i];
zs*=2;
}
zs=zs+A[FixedPoint_zs];
*a=zs+xs;
if(A[0]) *a=-(*a);
}
else
{
printf("please set type");
}
}
//C = A + B
void FixedPointCal::Add(int type, const Ftype* A, const Ftype *B, Ftype *C)
{
switch (type)
{
case TYPE_FLOAT:
C[0] = A[0] + B[0];
break;
case TYPE_FIXEDPOINT:
{
int AA[FixedPoint_all],BB[FixedPoint_all],CC[FixedPoint_all];
int i,j,k;
int flag=0;
/*
AA=(int*)malloc(FixedPoint_all*sizeof(int));
BB=(int*)malloc(FixedPoint_all*sizeof(int));
CC=(int*)malloc(FixedPoint_all*sizeof(int));
*/
for(i=0;i<FixedPoint_all;i++)
{
AA[i]=0;
BB[i]=0;
CC[i]=0;
}
AA[0]=A[0];
BB[0]=B[0];
if(A[0]==1)
{
i=FixedPoint_all-1;
while((!A[i])&&(i>0))i--;
if(i>0) AA[i]=1;i--;
for(;i>0;i--) AA[i]=1-A[i];
}
else
{
for(i=1;i<FixedPoint_all;i++) AA[i]=A[i];
}
if(B[0]==1)
{
i=FixedPoint_all-1;
while((!B[i])&&(i>0))i--;
if(i>0) BB[i]=1;i--;
for(;i>0;i--) BB[i]=1-B[i];
}
else
{
for(i=1;i<FixedPoint_all;i++) BB[i]=B[i];
}
for(i=FixedPoint_all-1;i>0;i--)
{
CC[i]=CC[i]+AA[i]+BB[i];
if(CC[i]>1)
{
CC[i]=CC[i]%2;
CC[i-1]++;
}
}
if(AA[0]!=BB[0])
{
k=1+CC[0];
CC[0]=k%2;
}
else CC[0]=AA[0];
if(CC[0])
{
i=FixedPoint_all-1;
while((!CC[i])&&(i>0))i--;
if(i>0) i--;
for(;i>0;i--) CC[i]=1-CC[i];
}
for(i=0;i<FixedPoint_all;i++) C[i]=CC[i];
return;
}
default:
printf("please set up fixed point flag\n");
break;
}
}
void FixedPointCal::Mul(int type, const Ftype *A,const Ftype *B,Ftype *C)
{
switch (type)
{
case TYPE_FLOAT:
C[0] = A[0] * B[0];
break;
case TYPE_FIXEDPOINT:
{
int CC[FixedPoint_all*2-1];
int i,j,k,flag;
if(A[0]!=B[0]) flag=1;else flag=0;
//CC=(int*)malloc(FixedPoint_all*2-1*sizeof(int));
for(i=FixedPoint_all*2-2;i>0;i--) CC[i]=0;
CC[0]=flag;
/*printf("A:\n");
for(i=0;i<=FixedPoint_zs;i++)printf("%d",A[i]);
printf(".");
for(;i<FixedPoint_all;i++)printf("%d",A[i]);
printf("\n");
printf("B:\n");
for(i=0;i<=FixedPoint_zs;i++)printf("%d",B[i]);
printf(".");
for(;i<FixedPoint_all;i++)printf("%d",B[i]);
printf("\n"); */
k=FixedPoint_all-1;
for(i=FixedPoint_all-1;i>0;i--)
{
if(B[i])
{
for(j=FixedPoint_all-1;j>0;j--) CC[k+j]+=A[j];
j=k+FixedPoint_all-1;
while(j>k)
{
if(CC[j]>1)
{
CC[j-1]++;
CC[j]=CC[j]%2;
}
j--;
}
}
k--;
}
C[0]=CC[0];
j=FixedPoint_zs;
for(i=1;i<FixedPoint_all;i++) C[i]=CC[i+j];
/*printf("C:\n");
for(i=0;i<=FixedPoint_zs;i++)printf("%d",C[i]);
printf(".");
for(;i<FixedPoint_all;i++)printf("%d",C[i]);
printf("\n");
printf("CC:\n");
for(i=0;i<=FixedPoint_zs*2;i++)printf("%d",CC[i]);
printf(".");
for(;i<FixedPoint_all*2-1;i++)printf("%d",CC[i]);
printf("\n");*/
return;
}
default:
printf("please set up fixed point flag\n");
break;
}
}
//
//void FixedPointCal::print_APoint(int type, Dtype* A)
// {
// if(type == TYPE_FLOAT)
// {
// printf("%f ",A[0]);
//
// }
// else if(type == TYPE_FIXEDPOINT)
// {
// int i =0;
// for( i=0;i<=FixedPoint_zs;i++)
// {
// printf("%d",A[i]);
// }
// printf(".");
// for(;i<FixedPoint_all;i++)
// {
// printf("%d",A[i]);
// }
// printf(" ");
//
//
// }
//
//
// }
bool FixedPointCal::equal(int type, const Ftype* A, const Ftype* B)
{
switch (type)
{
case TYPE_FLOAT:
if (A[0] == B[0])
{
return true;
}
else
{
return false;
}
case TYPE_FIXEDPOINT:
{
for (int i = 0; i < type; i++)
{
if(A[i]!=B[i])
{
return false;
}
}
return true;
}
default:
break;
}
}
//if A>B return true, else return false
const Ftype* FixedPointCal::Max(int type, const Ftype* A, const Ftype* B)
{
switch (type)
{
case TYPE_FLOAT:
{
return (A[0] >= B[0])?A:B;
}
break;
case TYPE_FIXEDPOINT:
{
//change to float first
float aa=0;
float bb=0;
rechange(type, &aa, A);
rechange(type, &bb, B);
float maxn = (aa>=bb)?aa:bb;
if (maxn == aa)
{
return A;
}
else
{
return B;
}
return A;
}
default:
break;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Fix.tar.gz_float_定点运算 乘法
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 45 浏览量
2022-09-24
06:35:04
上传
评论
收藏 3KB GZ 举报
温馨提示
共5个文件
h:3个
cpp:2个
实现了从浮点到定点的转换,即将float转换为32位int型数组,并且对加减乘法进行了重载,可以完成定点运算
资源推荐
资源详情
资源评论
收起资源包目录
Fix.tar.gz (5个子文件)
Fix
FixPoint.cpp 3KB
common.h 435B
FixPoint.h 944B
FixedPointCal.h 1KB
FixedPointCal.cpp 6KB
共 5 条
- 1
资源评论
APei
- 粉丝: 63
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功