当前位置:首页 » 编程语言 » c语言科学计算库
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言科学计算库

发布时间: 2022-02-15 21:05:17

‘壹’ C\C++有没有类似NumPy,SciPy这些Python上的优秀科学计算库

Armadillo, 数据类型都定好了,基本运算的算符也重载了,用起来跟Matlab差不多。C++ linear algebra library
blas lapack 像 tensorflow Mxnet 都有对应的C++ 库,都支持自动求导矩阵之类的操作

‘贰’ 求高手给一个用c语言写的 科学计算器 的源代码

没有科学计算器的,只有判普通的代码如下:
#include <dos.h> /*DOS接口函数*/
#include <math.h> /*数学函数的定义*/
#include <conio.h> /*屏幕操作函数*/
#include <stdio.h> /*I/O函数*/
#include <stdlib.h> /*库函数*/
#include <stdarg.h> /*变量长度参数表*/
#include <graphics.h> /*图形函数*/
#include <string.h> /*字符串函数*/
#include <ctype.h> /*字符操作函数*/
#define UP 0x48 /*光标上移键*/
#define DOWN 0x50 /*光标下移键*/
#define LEFT 0x4b /*光标左移键*/
#define RIGHT 0x4d /*光标右移键*/
#define ENTER 0x0d /*回车键*/
void *rar; /*全局变量,保存光标图象*/
struct palettetype palette; /*使用调色板信息*/
int GraphDriver; /* 图形设备驱动*/
int GraphMode; /* 图形模式值*/
int ErrorCode; /* 错误代码*/
int MaxColors; /* 可用颜色的最大数值*/
int MaxX, MaxY; /* 屏幕的最大分辨率*/
double AspectRatio; /* 屏幕的像素比*/
void drawboder(void); /*画边框函数*/
void initialize(void); /*初始化函数*/
void computer(void); /*计算器计算函数*/
void changetextstyle(int font, int direction, int charsize); /*改变文本样式函数*/
void mwindow(char *header); /*窗口函数*/
int specialkey(void) ; /*获取特殊键函数*/
int arrow(); /*设置箭头光标函数*/
/*主函数*/
int main()
{
initialize();/* 设置系统进入图形模式 */
computer(); /*运行计算器 */
closegraph();/*系统关闭图形模式返回文本模式*/
return(0); /*结束程序*/
}
/* 设置系统进入图形模式 */
void initialize(void)
{
int xasp, yasp; /* 用于读x和y方向纵横比*/
GraphDriver = DETECT; /* 自动检测显示器*/
initgraph( &GraphDriver, &GraphMode, "" );
/*初始化图形系统*/
ErrorCode = graphresult(); /*读初始化结果*/
if( ErrorCode != grOk ) /*如果初始化时出现错误*/
{
printf("Graphics System Error: %s\n",
grapherrormsg( ErrorCode ) ); /*显示错误代码*/
exit( 1 ); /*退出*/
}
getpalette( &palette ); /* 读面板信息*/
MaxColors = getmaxcolor() + 1; /* 读取颜色的最大值*/
MaxX = getmaxx(); /* 读屏幕尺寸 */
MaxY = getmaxy(); /* 读屏幕尺寸 */
getaspectratio( &xasp, &yasp ); /* 拷贝纵横比到变量中*/
AspectRatio = (double)xasp/(double)yasp;/* 计算纵横比值*/
}
/*计算器函数*/
void computer(void)
{
struct viewporttype vp; /*定义视口类型变量*/
int color, height, width;
int x, y,x0,y0, i, j,v,m,n,act,flag=1;
float num1=0,num2=0,result; /*操作数和计算结果变量*/
char cnum[5],str2[20]={""},c,temp[20]={""};
char str1[]="1230.456+-789*/Qc=^%";/* 定义字符串在按钮图形上显示的符号 */
mwindow( "Calculator" ); /* 显示主窗口 */
color = 7; /*设置灰颜色值*/
getviewsettings( &vp ); /* 读取当前窗口的大小*/
width=(vp.right+1)/10; /* 设置按钮宽度 */
height=(vp.bottom-10)/10 ; /*设置按钮高度 */
x = width /2; /*设置x的坐标值*/
y = height/2; /*设置y的坐标值*/
setfillstyle(SOLID_FILL, color+3);
bar( x+width*2, y, x+7*width, y+height );
/*画一个二维矩形条显示运算数和结果*/
setcolor( color+3 ); /*设置淡绿颜色边框线*/
rectangle( x+width*2, y, x+7*width, y+height );
/*画一个矩形边框线*/
setcolor(RED); /*设置颜色为红色*/
outtextxy(x+3*width,y+height/2,"0."); /*输出字符串"0."*/
x =2*width-width/2; /*设置x的坐标值*/
y =2*height+height/2; /*设置y的坐标值*/
for( j=0 ; j<4 ; ++j ) /*画按钮*/
{
for( i=0 ; i<5 ; ++i )
{
setfillstyle(SOLID_FILL, color);
setcolor(RED);
bar( x, y, x+width, y+height ); /*画一个矩形条*/
rectangle( x, y, x+width, y+height );
sprintf(str2,"%c",str1[j*5+i]);
/*将字符保存到str2中*/
outtextxy( x+(width/2), y+height/2, str2);
x =x+width+ (width / 2) ; /*移动列坐标*/
}
y +=(height/2)*3; /* 移动行坐标*/
x =2*width-width/2; /*复位列坐标*/
}
x0=2*width;
y0=3*height;
x=x0;
y=y0;
gotoxy(x,y); /*移动光标到x,y位置*/
arrow(); /*显示光标*/
putimage(x,y,rar,XOR_PUT);
m=0;
n=0;
strcpy(str2,""); /*设置str2为空串*/
while((v=specialkey())!=45) /*当压下Alt+x键结束程序,否则执行下面的循环*/
{
while((v=specialkey())!=ENTER) /*当压下键不是回车时*/
{
putimage(x,y,rar,XOR_PUT); /*显示光标图象*/
if(v==RIGHT) /*右移箭头时新位置计算*/
if(x>=x0+6*width)
/*如果右移,移到尾,则移动到最左边字符位置*/
{
x=x0;
m=0;
}
else
{
x=x+width+width/2;
m++;
} /*否则,右移到下一个字符位置*/
if(v==LEFT) /*左移箭头时新位置计算*/
if(x<=x0)
{
x=x0+6*width;
m=4;
} /*如果移到头,再左移,则移动到最右边字符位置*/
else
{
x=x-width-width/2;
m--;
} /*否则,左移到前一个字符位置*/
if(v==UP) /*上移箭头时新位置计算*/
if(y<=y0)
{
y=y0+4*height+height/2;
n=3;
} /*如果移到头,再上移,则移动到最下边字符位置*/
else
{
y=y-height-height/2;
n--;
} /*否则,移到上边一个字符位置*/
if(v==DOWN) /*下移箭头时新位置计算*/
if(y>=7*height)
{
y=y0;
n=0;
} /*如果移到尾,再下移,则移动到最上边字符位置*/
else
{
y=y+height+height/2;
n++;
} /*否则,移到下边一个字符位置*/
putimage(x,y,rar,XOR_PUT); /*在新的位置显示光标箭头*/
}
c=str1[n*5+m]; /*将字符保存到变量c中*/
if(isdigit(c)||c=='.') /*判断是否是数字或小数点*/
{
if(flag==-1) /*如果标志为-1,表明为负数*/
{
strcpy(str2,"-"); /*将负号连接到字符串中*/
flag=1;
} /*将标志值恢复为1*/
sprintf(temp,"%c",c); /*将字符保存到字符串变量temp中*/
strcat(str2,temp); /*将temp中的字符串连接到str2中*/
setfillstyle(SOLID_FILL,color+3);
bar(2*width+width/2,height/2,15*width/2,3*height/2);
outtextxy(5*width,height,str2); /*显示字符串*/
}
if(c=='+')
{
num1=atof(str2); /*将第一个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=1; /*做计算加法标志值*/
setfillstyle(SOLID_FILL,color+3);
bar(2*width+width/2,height/2,15*width/2,3*height/2);
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='-')
{
if(strcmp(str2,"")==0) /*如果str2为空,说明是负号,而不是减号*/
flag=-1; /*设置负数标志*/
else
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=2; /*做计算减法标志值*/
setfillstyle(SOLID_FILL,color+3);
bar(2*width+width/2,height/2,15*width/2,3*height/2); /*画矩形*/
outtextxy(5*width,height,"0."); /*显示字符串*/
}
}
if(c=='*')
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=3; /*做计算乘法标志值*/
setfillstyle(SOLID_FILL,color+3); bar(2*width+width/2,height/2,15*width/2,3*height/2);
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='/')
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=4; /*做计算除法标志值*/
setfillstyle(SOLID_FILL,color+3);
bar(2*width+width/2,height/2,15*width/2,3*height/2);
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='^')
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=5; /*做计算乘方标志值*/
setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,15*width/2,3*height/2); /*画矩形*/
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='%')
{
num1=atof(str2); /*将第二个操作数转换为浮点数*/
strcpy(str2,""); /*将str2清空*/
act=6; /*做计算模运算乘方标志值*/
setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,15*width/2,3*height/2); /*画矩形*/
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='=')
{
num2=atof(str2); /*将第二个操作数转换为浮点数*/
switch(act) /*根据运算符号计算*/
{
case 1:result=num1+num2;break; /*做加法*/
case 2:result=num1-num2;break; /*做减法*/
case 3:result=num1*num2;break; /*做乘法*/
case 4:result=num1/num2;break; /*做除法*/
case 5:result=pow(num1,num2);break; /*做x的y次方*/
case 6:result=fmod(num1,num2);break; /*做模运算*/
}
setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,15*width/2,3*height/2); /*覆盖结果区*/
sprintf(temp,"%f",result); /*将结果保存到temp中*/
outtextxy(5*width,height,temp); /*显示结果*/
}
if(c=='c')
{
num1=0; /*将两个操作数复位0,符号标志为1*/
num2=0;
flag=1;
strcpy(str2,""); /*将str2清空*/
setfillstyle(SOLID_FILL,color+3); /*设置用淡绿色实体填充*/
bar(2*width+width/2,height/2,15*width/2,3*height/2); /*覆盖结果区*/
outtextxy(5*width,height,"0."); /*显示字符串*/
}
if(c=='Q')exit(0); /*如果选择了q回车,结束计算程序*/
}
putimage(x,y,rar,XOR_PUT); /*在退出之前消去光标箭头*/
return; /*返回*/
}
/*窗口函数*/
void mwindow( char *header )
{
int height;
cleardevice(); /* 清除图形屏幕 */
setcolor( MaxColors - 1 ); /* 设置当前颜色为白色*/
setviewport( 20, 20, MaxX/2, MaxY/2, 1 ); /* 设置视口大小 */
height = textheight( "H" ); /* 读取基本文本大小 */
settextstyle( DEFAULT_FONT, HORIZ_DIR, 1 );/*设置文本样式*/
settextjustify( CENTER_TEXT, TOP_TEXT );/*设置字符排列方式*/
outtextxy( MaxX/4, 2, header ); /*输出标题*/
setviewport( 20,20+height+4, MaxX/2+4, MaxY/2+20, 1 ); /*设置视口大小*/
drawboder(); /*画边框*/
}
void drawboder(void) /*画边框*/
{
struct viewporttype vp; /*定义视口类型变量*/
setcolor( MaxColors - 1 ); /*设置当前颜色为白色 */
setlinestyle( SOLID_LINE, 0, NORM_WIDTH );/*设置画线方式*/
getviewsettings( &vp );/*将当前视口信息装入vp所指的结构中*/
rectangle( 0, 0, vp.right-vp.left, vp.bottom-vp.top ); /*画矩形边框*/
}
/*设计鼠标图形函数*/
int arrow()
{
int size;
int raw[]={4,4,4,8,6,8,14,16,16,16,8,6,8,4,4,4}; /*定义多边形坐标*/
setfillstyle(SOLID_FILL,2); /*设置填充模式*/
fillpoly(8,raw); /*画出一光标箭头*/
size=imagesize(4,4,16,16); /*测试图象大小*/
rar=malloc(size); /*分配内存区域*/
getimage(4,4,16,16,rar); /*存放光标箭头图象*/
putimage(4,4,rar,XOR_PUT); /*消去光标箭头图象*/
return 0;
}
/*按键函数*/
int specialkey(void)
{
int key;
while(bioskey(1)==0); /*等待键盘输入*/
key=bioskey(0); /*键盘输入*/
key=key&0xff? key&0xff:key>>8; /*只取特殊键的扫描值,其余为0*/
return(key); /*返回键值*/
}

‘叁’ 如何用c语言进行科学计算,如同fortran那样

C语言的计算能力不逊于Fortran的,只要你认真学。

‘肆’ C\C++有没有类似NumPy,SciPy这些Python上的优秀科学计算库

blas lapack 像 tensorflow Mxnet 都有对应的C++ 库,都支持自动求导矩阵之类的操作

‘伍’ 信息与计算科学专业的学生,想从事计算机方面发展,可以去学些什么(比如数据库JAVA,现在只学C语言)

先把C功底打好,最好能把C++弄明白,其他的都是浮云,数据结构、算法很重要
大师曾说:程序=数据结构+算法
数据库也要好好学学,有兴趣可以好好研究一下oracle等

‘陆’ 51单片机做科学计算器的c语言程序

给些子程序吧
好的就加分,其实我也是收藏别人的

嵌入式系统>51单片机浮点运算子程序库

1: FSDT 功能:浮点数格式化
2: FADD 功能:浮点数加法
3: FSUB 功能:浮点数减法
4: FMUL 功能:浮点数乘法
5: FDIV 功能:浮点数除法
6: FCLR 功能:浮点数清零
7: FZER 功能:浮点数判零
8: FMOV 功能:浮点数传送
9: FPUS 功能:浮点数压栈
10: FPOP 功能:浮点数出栈
11: FCMP 功能:浮点数代数值比较不影响待比较操作数
12: FABS 功能:浮点绝对值函数
13: FSGN 功能:浮点符号函数
14: FINT 功能:浮点取整函数
15: FRCP 功能:浮点倒数函数
16: FSQU 功能:浮点数平方
17: FSQR 功能:浮点数开平方快速逼近算法
18: FPLN 功能:浮点数多项式计算
19: FLOG 功能:以10为底的浮点对数函数
20: FLN 功能:以e为底的浮点对数函数
21: FE10 功能:以10为底的浮点指数函数
22: FEXP 功能:以e为底的浮点指数函数
23: FE2 功能:以2为底的浮点指数函数
24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数
25: FTOD 功能:格式化浮点数转换成双字节定点数
26: BTOF 功能:浮点BCD码转换成格式化浮点数
27: FTOB 功能:格式化浮点数转换成浮点BCD码
28: FCOS 功能:浮点余弦函数
29: FSIN 功能:浮点正弦函数
30: FATN 功能:浮点反正切函数
31: RTOD 功能:浮点弧度数转换成浮点度数
32: DTOR 功能:浮点度数转换成浮点弧度数

为便于读者使用本程序库,先将有关约定说明如下:
1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节?如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H?
2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示?当尾数的最高位为1时,便称为规格化浮点数,简称操作数?在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H?若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H?
3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示?当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382的阶码是 0FEH?在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数?例如有一个十进制浮点操作数存放在30H?31H?32H中,数值是 -0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H?若用[R0]来指向它,则应使(R0)=30H?
4.运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换?不管那种数据格式,随着连续运算的次数增加,精度都会下降?
5.工作区:数据工作区固定在A?B?R2~R7,数符或标志工作区固定在PSW和23H单元(位1CH~1FH)?在浮点系统中,R2?R3?R4和位1FH为第一工作区,R5?R6?R7和位1EH为第二工作区?用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性?
6.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用积木方式(或流水线方式)完成一个公式的计算?以浮点运算为例:
计算 y = Ln √ | Sin (ab/c+d) |
已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它们分别存放在30H?33H?36H?39H开始的连续三个单元中?用BCD码浮点数表示时,分别为a=831234H;b=007577H;c=025634H;d=011276H?
求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各
种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用?程序如下:

TEST: MOV R0,#39H ;指向BCD码浮点操作数d
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#36H ;指向BCD码浮点操作数c
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#33H ;指向BCD码浮点操作数b
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#30H ;指向BCD码浮点操作数a
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1,#33H ;指向二进制浮点操作数b
LCALL FMUL ;进行浮点乘法运算
MOV R1,#36H ;指向二进制浮点操作数c
LCALL FDIV ;进行浮点除法运算
MOV R1,#39H ;指向二进制浮点操作数d
LCALL FADD ;进行浮点加法运算
LCALL FSIN ;进行浮点正弦运算
LCALL FABS ;进行浮点绝对值运算
LCALL FSQR ;进行浮点开平方运算
LCALL FLN ;进行浮点对数运算
LCALL FTOB ;将结果转换成BCD码浮点数
STOP: LJMP STOP
END

运行结果,[R0]=804915H,即y=-0.4915,比较精确的结果应该是-0.491437?

(1) 标号: FSDT 功能:浮点数格式化
入口条件:待格式化浮点操作数在[R0]中?
出口信息:已格式化浮点操作数仍在[R0]中?
影响资源:PSW?A?R2?R3?R4?位1FH 堆栈需求: 6字节
FSDT: LCALL MVR0 ;将待格式化操作数传送到第一工作区中
LCALL RLN ;通过左规完成格式化
LJMP MOV0 ;将已格式化浮点操作数传回到[R0]中

(2) 标号: FADD 功能:浮点数加法
入口条件:被加数在[R0]中,加数在[R1]中?
出口信息:OV=0时,和仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 6字节
FADD: CLR F0 ;设立加法标志
SJMP AS ;计算代数和

(3) 标号: FSUB 功能:浮点数减法
入口条件:被减数在[R0]中,减数在[R1]中?
出口信息:OV=0时,差仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:6字节
FSUB: SETB F0 ;设立减法标志
AS: LCALL MVR1 ;计算代数和?先将[R1]传送到第二工作区
MOV C,F0 ;用加减标志来校正第二操作数的有效符号
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中
XRL A,@R0 ;与第一操作数的符号比较
RLC A
MOV F0,C ;保存比较结果
LCALL MVR0 ;将[R0]传送到第一工作区中
LCALL AS1 ;在工作寄存器中完成代数运算
MOV0: INC R0 ;将结果传回到[R0]中的子程序入口
INC R0
MOV A,R4 ;传回尾数的低字节
MOV @R0,A
DEC R0
MOV A,R3 ;传回尾数的高字节
MOV @R0,A
DEC R0
MOV A,R2 ;取结果的阶码
MOV C,1FH ;取结果的数符
MOV ACC.7,C ;拼入阶码中
MOV @R0,A
CLR ACC.7 ;不考虑数符
CLR OV ;清除溢出标志
CJNE A,#3FH,MV01;阶码是否上溢?
SETB OV ;设立溢出标志
MV01: MOV A,@R0 ;取出带数符的阶码
RET
MVR0: MOV A,@R0 ;将[R0]传送到第一工作区中的子程序
MOV C,ACC.7 ;将数符保存在位1FH中
MOV 1FH,C
MOV C,ACC.6 ;将阶码扩充为8bit补码
MOV ACC.7,C
MOV R2,A ;存放在R2中
INC R0
MOV A,@R0 ;将尾数高字节存放在R3中
MOV R3,A
INC R0
MOV A,@R0 ;将尾数低字节存放在R4中
MOV R4,A
DEC R0 ;恢复数据指针
DEC R0
RET
MVR1: MOV A,@R1 ;将[R1]传送到第二工作区中的子程序
MOV C,ACC.7 ;将数符保存在位1EH中
MOV 1EH,C
MOV C,ACC.6 ;将阶码扩充为8bit补码
MOV ACC.7,C
MOV R5,A ;存放在R5中
INC R1
MOV A,@R1 ;将尾数高字节存放在R6中
MOV R6,A
INC R1
MOV A,@R1 ;将尾数低字节存放在R7中
MOV R7,A
DEC R1 ;恢复数据指针
DEC R1
RET
AS1: MOV A,R6 ;读取第二操作数尾数高字节
ORL A,R7
JZ AS2 ;第二操作数为零,不必运算
MOV A,R3 ;读取第一操作数尾数高字节
ORL A,R4
JNZ EQ1
MOV A,R6 ;第一操作数为零,结果以第二操作数为准
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,1EH
MOV 1FH,C
AS2: RET
EQ1: MOV A,R2 ;对阶,比较两个操作数的阶码
XRL A,R5
JZ AS4 ;阶码相同,对阶结束
JB ACC.7,EQ3;阶符互异
MOV A,R2 ;阶符相同,比较大小
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C ;第二操作数右规一次
MOV A,R6 ;尾数缩小一半
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5 ;阶码加一
ORL A,R6 ;尾数为零否?
JNZ EQ1 ;尾数不为零,继续对阶
MOV A,R2 ;尾数为零,提前结束对阶
MOV R5,A
SJMP AS4
EQ3: MOV A,R2 ;判断第一操作数阶符
JNB ACC.7,EQ2;如为正,右规第二操作数
EQ4: CLR C
LCALL RR1 ;第一操作数右规一次
ORL A,R3 ;尾数为零否?
JNZ EQ1 ;不为零,继续对阶
MOV A,R5 ;尾数为零,提前结束对阶
MOV R2,A
AS4: JB F0,AS5 ;尾数加减判断
MOV A,R4 ;尾数相加
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1 ;有进位,右规一次
AS5: CLR C ;比较绝对值大小
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B ;第一尾数减第二尾数
MOV R3,A
LJMP RLN ;结果规格化
AS6: CPL 1FH ;结果的符号与第一操作数相反
CLR C ;结果的绝对值为第二尾数减第一尾数
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3 ;浮点数规格化
ORL A,R4 ;尾数为零否?
JNZ RLN1
MOV R2,#0C1H;阶码取最小值
RET
RLN1: MOV A,R3
JB ACC.7,RLN2;尾数最高位为一否?
CLR C ;不为一,左规一次
LCALL RL1
SJMP RLN ;继续判断
RLN2: CLR OV ;规格化结束
RET
RL1: MOV A,R4 ;第一操作数左规一次
RLC A ;尾数扩大一倍
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2 ;阶码减一
CJNE R2,#0C0H,RL1E;阶码下溢否?
CLR A
MOV R3,A ;阶码下溢,操作数以零计
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3 ;第一操作数右规一次
RRC A ;尾数缩小一半
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2 ;阶码加一
CLR OV ;清溢出标志
CJNE R2,#40H,RR1E;阶码上溢否?
MOV R2,#3FH ;阶码溢出
SETB OV
RR1E: RET

(4) 标号:FMUL 功能:浮点数乘法
入口条件:被乘数在[R0]中,乘数在[R1]中?
出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:6字节
FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中
MOV A,@R0
XRL A,@R1 ;比较两个操作数的符号
RLC A
MOV 1FH,C ;保存积的符号
LCALL MUL0 ;计算积的绝对值
LJMP MOV0 ;将结果传回到[R0]中
MUL0: LCALL MVR1 ;将[R1]传送到第二工作区中
MUL1: MOV A,R3 ;第一尾数为零否?
ORL A,R4
JZ MUL6
MOV A,R6 ;第二尾数为零否?
ORL A,R7
JZ MUL5
MOV A,R7 ;计算R3R4×R6R7-→R3R4
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
XCH A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
JB ACC.7,MUL2;积为规格化数否?
MOV A,R7 ;左规一次
RLC A
MOV R7,A
LCALL RL1
MUL2: MOV A,R7
JNB ACC.7,MUL3
INC R4
MOV A,R4
JNZ MUL3
INC R3
MOV A,R3
JNZ MUL3
MOV R3,#80H
INC R2
MUL3: MOV A,R2 ;求积的阶码
ADD A,R5
MD: MOV R2,A ;阶码溢出判断
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV R2,#3FH ;阶码上溢,设立标志
SETB OV
RET
MUL4: JB ACC.6,MUL6
MUL5: CLR A ;结果清零(因子为零或阶码下溢)
MOV R3,A
MOV R4,A
MOV R2,#41H
MUL6: CLR OV
RET

(5) 标号: FDIV 功能:浮点数除法
入口条件:被除数在[R0]中,除数在[R1]中?
出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节
FDIV: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ DIV1
MOV @R0,#41H;被除数为零,不必运算
CLR OV
RET
DIV1: INC R1
MOV A,@R1
INC R1
ORL A,@R1
DEC R1
DEC R1
JNZ DIV2
SETB OV ;除数为零,溢出
RET
DIV2: LCALL MVR0 ;将[R0]传送到第一工作区中
MOV A,@R0
XRL A,@R1 ;比较两个操作数的符号
RLC A
MOV 1FH,C ;保存结果的符号
LCALL MVR1 ;将[R1]传送到第二工作区中
LCALL DIV3 ;调用工作区浮点除法
LJMP MOV0 ;回传结果
DIV3: CLR C ;比较尾数的大小
MOV A,R4
SUBB A,R7
MOV A,R3
SUBB A,R6
JC DIV4
LCALL RR1 ;被除数右规一次
SJMP DIV3
DIV4: CLR A ;借用R0R1R2作工作寄存器
XCH A,R0 ;清零并保护之
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H ;除法运算,R3R4/R6R7-→R0R1
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6 ;四舍五入
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1 ;将结果存回R3R4
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC ;恢复R0R1R2
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2 ;计算商的阶码
CLR C
SUBB A,R5
LCALL MD ;阶码检验
LJMP RLN ;规格化

(6) 标号: FCLR 功能:浮点数清零
入口条件:操作数在[R0]中?
出口信息:操作数被清零?
影响资源:A 堆栈需求: 2字节
FCLR: INC R0
INC R0
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
DEC R0
MOV @R0,#41H
RET

(7) 标号: FZER 功能:浮点数判零
入口条件:操作数在[R0]中?
出口信息:若累加器A为零,则操作数[R0]为零,否则不为零?
影响资源:A 堆栈需求: 2字节
FZER: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ ZERO
MOV @R0,#41H
ZERO: RET

(8) 标号: FMOV 功能:浮点数传送
入口条件:源操作数在[R1]中,目标地址为[R0]?
出口信息:[R0]=[R1],[R1]不变?
影响资源:A 堆栈需求: 2字节
FMOV: INC R0
INC R0
INC R1
INC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
RET

(9) 标号: FPUS 功能:浮点数压栈
入口条件:操作数在[R0]中?
出口信息:操作数压入栈顶?
影响资源:A?R2?R3 堆栈需求: 5字节
FPUS: POP ACC ;将返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
MOV A,@R0 ;将操作数压入堆栈
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
DEC R0
DEC R0
MOV A,R3 ;将返回地址压入堆栈
PUSH ACC
MOV A,R2
PUSH ACC
RET ;返回主程序

(10) 标号: FPOP 功能:浮点数出栈
入口条件:操作数处于栈顶?
出口信息:操作数弹至[R0]中?
影响资源:A?R2?R3 堆栈需求: 2字节
FPOP: POP ACC ;将返回地址保存在R2R3中
MOV R2,A
POP ACC
MOV R3,A
INC R0
INC R0
POP ACC ;将操作数弹出堆栈,传送到[R0]中
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
MOV A,R3 ;将返回地址压入堆栈
PUSH ACC
MOV A,R2
PUSH ACC
RET ;返回主程序

(11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数)
入口条件:待比较操作数分别在[R0]和[R1]中?
出口信息:若CY=1,则[R0] < [R1],若CY=0且A=0则 [R0] = [R1],否则[R0] > [R1]?
影响资源:A?B?PSW 堆栈需求: 2字节
FCMP: MOV A,@R0 ;数符比较
XRL A,@R1
JNB ACC.7,CMP2
MOV A,@R0 ;两数异号,以[R0]数符为准
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1 ;两数同号,准备比较阶码
MOV C,ACC.6
MOV ACC.7,C
MOV B,A
MOV A,@R0
MOV C,ACC.7
MOV F0,C ;保存[R0]的数符
MOV C,ACC.6
MOV ACC.7,C
CLR C ;比较阶码
SUBB A,B
JZ CMP6
RLC A ;取阶码之差的符号
JNB F0,CMP5
CPL C ;[R0]为负时,结果取反
CMP5: MOV A,#0FFH ;两数不相等
RET
CMP6: INC R0 ;阶码相同时,准备比较尾数
INC R0
INC R1
INC R1
CLR C
MOV A,@R0
SUBB A,@R1
MOV B,A ;保存部分差
DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
ORL A,B ;生成是否相等信息
JZ CMP7
JNB F0,CMP7
CPL C ;[R0]为负时,结果取反
CMP7: RET

(12) 标号: FABS 功能:浮点绝对值函数
入口条件:操作数在[R0]中?
出口信息:结果仍在[R0]中?
影响资源:A 堆栈需求: 2字节
FABS: MOV A,@R0 ;读取操作数的阶码
CLR ACC.7 ;清除数符
MOV @R0,A ;回传阶码
RET

(13) 标号: FSGN 功能:浮点符号函数
入口条件:操作数在[R0]中?
出口信息:累加器 A=1 时为正数,A=0FFH时为负数,A=0 时为零?
影响资源:PSW?A 堆栈需求: 2字节
FSGN: INC R0 ;读尾数
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ SGN
RET ;尾数为零,结束
SGN: MOV A,@R0 ;读取操作数的阶码
RLC A ;取数符
MOV A,#1 ;按正数初始化
JNC SGN1 ;是正数,结束
MOV A,#0FFH ;是负数,改变标志
SGN1: RET

(14) 标号: FINT 功能:浮点取整函数
入口条件:操作数在[R0]中?
出口信息:结果仍在[R0]中?
影响资源:PSW?A?R2?R3?R4?位1FH 堆栈需求: 6字节
FINT: LCALL MVR0 ;将[R0]传送到第一工作区中
LCALL INT ;在工作寄存器中完成取整运算
LJMP MOV0 ;将结果传回到[R0]中
INT: MOV A,R3
ORL A,R4
JNZ INTA
CLR 1FH ;尾数为零,阶码也清零,结束取整
MOV R2,#41H
RET
INTA: MOV A,R2
JZ INTB ;阶码为零否?
JB ACC.7,INTB;阶符为负否?
CLR C
SUBB A,#10H ;阶码小于16否?
JC INTD
RET ;阶码大于16,已经是整数
INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一
MOV R4,A
MOV C,1FH
RRC A
MOV R3,A
RL A
MOV R2,A
JNZ INTC
MOV R2,#41H
INTC: RET
INTD: CLR F0 ;舍尾标志初始化
INTE: CLR C
LCALL RR1 ;右规一次
ORL C,F0 ;记忆舍尾情况
MOV F0,C
CJNE R2,#10H,INTE;阶码达到16(尾数完全为整数)否?
JNB F0,INTF ;舍去部分为零否?
JNB 1FH,INTF;操作数为正数否?
INC R4 ;对于带小数的负数,向下取整
MOV A,R4
JNZ INTF
INC R3
INTF: LJMP RLN ;将结果规格化

(15) 标号: FRCP 功能:浮点倒数函数
入口条件:操作数在[R0]中?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节
FRCP: MOV A,@R0
MOV C,ACC.7
MOV 1FH,C ;保存数符
MOV C,ACC.6 ;绝对值传送到第二工作区
MOV ACC.7,C
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
DEC R0
DEC R0
ORL A,R6
JNZ RCP
SETB OV ;零不能求倒数,设立溢出标志
RET
RCP: MOV A,R6
JB ACC.7,RCP2;操作数格式化否?
CLR C ;格式化之
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP RCP
RCP2: MOV R2,#1 ;将数值1.00传送到第一工作区
MOV R3,#80H
MOV R4,#0
LCALL DIV3 ;调用工作区浮点除法,求得倒数
LJMP MOV0 ;回传结果

(16) 标号: FSQU 功能:浮点数平方
入口条件:操作数在[R0]中?
出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出?
影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 9字节
FSQU: MOV A,R0 ;将操作数
XCH A,R1 ;同时作为乘数
PUSH ACC ;保存R1指针
LCALL FMUL ;进行乘法运算
POP ACC
MOV R1,A ;恢复R1指针
RET

(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)
入口条件:操作数在[R0]中?
出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错?
影响资源:PSW?A?B?R2~R7 堆栈需求: 2字节
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV ;负数开平方,出错
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H;尾数为零,不必运算
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6 ;将阶码扩展成8bit补码
MOV ACC.7,C
INC A ;加一
CLR C
RRC A ;除二
MOV @R0,A ;得到平方根的阶码,回存之
INC R0 ;指向被开方数尾数的高字节
JC SQR0 ;原被开方数的阶码是奇数吗?
MOV A,@R0 ;是奇数,尾数右规一次
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9 ;尾数为零,不必运算
MOV R2,A ;将尾数传送到R2R3中
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2 ;快速开方,参阅定点子程序说明
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,B
XCH A,R2
SUBB A,R2
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
SJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R3 ;将平方根的尾数回传到[R0]中
MOV @R0,A
DEC R0
MOV A,R2
MOV @R0,A
SQR9: DEC R0 ;数据指针回归原位
CLR OV ;开方结果有效
RET

(18) 标号: FPLN 功能:浮点数多项式计算
入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出?
影响资源:DPTR?PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 4字节
FPLN: POP DPH ;取出多项式系数存放地址
POP DPL
XCH A,R0 ;R0?R1交换角色,自变量在[R1]中
XCH A,R1
XCH A,R0
CLR A ;清第一工作区
MOV R2,A
MOV R3,A
MOV R4,A
CLR 1FH
PLN1: CLR A ;读取一个系数,并装入第二工作区
MOVC A,@A+DPTR
MOV C,ACC.7
MOV 1EH,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R7,A
INC DPTR ;指向下一个系数
MOV C,1EH ;比较两个数符
RRC A
XRL A,23H
RLC A
MOV F0,C ;保存比较结果
LCALL AS1 ;进行代数加法运算
CLR A ;读取下一个系数的第一个字节
MOVC A,@A+DPTR
CJNE A,#40H,PLN2;是结束标志吗?
XCH A,R0 ;运算结束,恢复R0?R1原来的角色
XCH A,R1
XCH A,R0
LCALL MOV0 ;将结果回传到[R0]中
CLR A
INC DPTR
JMP @A+DPTR ;返回主程序
PLN2: MOV A,@R1 ;比较自变量和中间结果的符号
XRL A,23H
RLC A
MOV 1FH,C ;保存比较结果
LCALL MUL0 ;进行乘法运算
SJMP PLN1 ;继续下一项运算

(19) 标号: FLOG 功能:以10为底的浮点对数函数
入口条件:操作数在[R0]中?
出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错?
影响资源:DPTR?PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:9字节
FLOG: LCALL FLN ;先以e为底求对数
JNB OV,LOG
RET ;如溢出则停止计算
LOG: MOV R5,#0FFH;系数0.43430(1/Ln10)
MOV R6,#0DEH
MOV R7,#5CH
LCALL MUL1 ;通过相乘来换底
LJMP MOV0 ;传回结果

‘柒’ c语言 算一个double类型数 是几位数,帮忙!

这个要自己写,sizeof得到是存储占据字节,可以用这样做
void main()
{
double a=3.141010;
char buffe[20];
sprintf(buffe,"%f",a);
cout<<buffe<<endl;
cout<<strlen(buffe)<<endl;
}

‘捌’ C语言里的math.h还有很多类似的都应该在什么时候用呢

C库函数手册---math.h、stdlib.h、string.h、float.h

数学函数,所在函数库为math.h、stdlib.h、string.h、float.h
int abs(int i) 返回整型参数i的绝对值
double cabs(struct complex znum) 返回复数znum的绝对值
double fabs(double x) 返回双精度参数x的绝对值
long labs(long n) 返回长整型参数n的绝对值
double exp(double x) 返回指数函数ex的值
double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中
double ldexp(double value,int exp); 返回value*2exp的值
double log(double x) 返回logex的值
double log10(double x) 返回log10x的值
double pow(double x,double y) 返回xy的值
double pow10(int p) 返回10p的值
double sqrt(double x) 返回+√x的值
double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度
double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度
double atan(double x) 返回x的反正切tan-1(x)值,x为弧度
double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度
double cos(double x) 返回x的余弦cos(x)值,x为弧度
double sin(double x) 返回x的正弦sin(x)值,x为弧度
double tan(double x) 返回x的正切tan(x)值,x为弧度
double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度
double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度
double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度
double hypot(double x,double y) 返回直角三角形斜边的长度(z),
x和y为直角边的长度,z2=x2+y2
double ceil(double x) 返回不小于x的最小整数
double floor(double x) 返回不大于x的最大整数
void srand(unsigned seed) 初始化随机数发生器
int rand() 产生一个随机数并返回这个数
double poly(double x,int n,double c[])从参数产生一个多项式
double modf(double value,double *iptr)将双精度数value分解成尾数和阶
double fmod(double x,double y) 返回x/y的余数
double frexp(double value,int *eptr) 将双精度数value分成尾数和阶
double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数
double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数
double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数
char *ecvt(double value,int ndigit,int *decpt,int *sign)
将浮点数value转换成字符串并返回该字符串
char *fcvt(double value,int ndigit,int *decpt,int *sign)
将浮点数value转换成字符串并返回该字符串
char *gcvt(double value,int ndigit,char *buf)
将数value转换成字符串并存于buf中,并返回buf的指针
char *ultoa(unsigned long value,char *string,int radix)
将无符号整型数value转换成字符串并返回该字符串,radix为转换时所用基数
char *ltoa(long value,char *string,int radix)
将长整型数value转换成字符串并返回该字符串,radix为转换时所用基数
char *itoa(int value,char *string,int radix)
将整数value转换成字符串存入string,radix为转换时所用基数
double atof(char *nptr) 将字符串nptr转换成双精度数,并返回这个数,错误返回0
int atoi(char *nptr) 将字符串nptr转换成整型数, 并返回这个数,错误返回0
long atol(char *nptr) 将字符串nptr转换成长整型数,并返回这个数,错误返回0
double strtod(char *str,char **endptr)将字符串str转换成双精度数,并返回这个数,
long strtol(char *str,char **endptr,int base)将字符串str转换成长整型数,
并返回这个数,
int matherr(struct exception *e)
用户修改数学错误返回信息函数(没有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
double *arg2p,double retval)
用户修改数学错误返回信息函数(没有必要使用)
unsigned int _clear87() 清除浮点状态字并返回原来的浮点状态
void _fpreset() 重新初使化浮点数学程序包
unsigned int _status87() 返回浮点状态字

‘玖’ lapack依赖c++标准库吗

1. GCC版本要求
使用较新版本的GCC工具集(尽量不低于v4.7)且集成有gfortran编译器。
备注1:这里大写的"GCC"是指GNU Compiler Collection,它除包含C语言编译器gcc外,还包含很多其它语言的编译器(如g++/gfortran等)
备注2:3.x版的的C语言编译器gcc会由于某些头文件缺失导致编译atlas库报错
备注3:若GCC工具集中没有gfortran编译器,则编译lapack库时会遇到一些莫名其妙的错误(因为lapack是用fortran编写的),好在GCC4.7及以上版本中已经集成了gfortran编译器
在GCC版本符合要求的前提下,临时将其加入环境变量PATH并设置动态库查找路径:

[plain] view plain 在CODE上查看代码片派生到我的代码片
$ export PATH=/home/slvher/tools/gcc48/bin/:$PATH
$ export LD_LIBRARY_PATH=/home/slvher/tools/gcc48/lib64:/home/slvher/tools/gcc48/lib
备注4:在当前shell会话中临时设置LD_LIBRARY_PATH可以保证编译过程中正确搜索到GCC库,但最好不要设置到.bash_profile中,因为那样会影响其它程序的查找路径,可能会踩到坑。
备注5:这里提到的GCC的版本要求及环境变量设置如果没有出差错,那么下面的编译会比较顺利,否则会遇到各种编译/链接问题,后续我会用一篇笔记来记录这些踩坑的过程及遇到这些诡异问题时的分析思路,这里不赘述。
2. 编译LAPACK和ATLAS库
lapack是用fortran开发的经过特别优化的线性代数计算库;atlas也是一个优化过的线性代数计算库,它提供了BLAS库的全部API(包括C接口和Fortran接口),还实现了lapack库中的部分函数,atlas在编译过程中会根据机器的配置参数来调整科学计算函数的参数,以便在该机器上达到更好的计算性能。
初看起来,需要分别编译lapack和atlas两个库,所幸的是,atlas库支持编译时自动编译lapack库,因此,只需正确完成atlas库的编译配置,编译atlas库就可以了。
下面是编译atlas/lapack库的主要步骤。
1) 分别从官网下载lapack源码包和atlas源码包,我下载的是目前的最新版lapack-3.5.0.tgz及atlas3.10.2.tar.bz2
2) 解压atlas源码压缩包:tar -jxvf atlas3.10.2.tar.bz2
3) cd ATLAS && mkdir BLDdir && cd BLDdir
4) 执行configure命令以配置编译参数
[plain] view plain 在CODE上查看代码片派生到我的代码片
$ ../configure --shared -b 64 --prefix=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs --with-netlib-lapack-tarfile=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/lapack-3.5.0.tgz
其中,--shared表明要编译atlas共享库(configure会自动在编译命令中插入"-fPIC"参数,无需在这里显式指定);--prefix指定编译结果的安装路径;--with-netlib-lapack-tarfile表明编译atlas库时会用相同的编译器及编译/链接参数自动编译lapack库,这里指定lapack源码包的路径后,configure运行后会自动解压lapack源码并将其拷贝至BLDdir/src/lapack/reference/这个目录下。
5) configure运行完后,BLDdir目录下生成了Make.inc文件,该文件中设置了众多编译参数(如查找路径、编译产出路径、编译器、传给编译器的参数,等等),BLDdir子目录下很多模块的Makefile都会include这个Make.inc,包括源码独立的lapack包,可见,这个Make.inc文件可以达到统一编译环境的目的。
6) make build
7) make check
8) make ptcheck
9) make install
如果上述一系列命令均执行成功,那么编译完成的*.a和*.so库会安装到--prefix参数指定的路径下,这些库的头文件也会被拷贝到安装路径下的include目录。
至此,ATLAS和LAPACK库均完成编译,其中LAPACK库是.a静态库,ATLAS库是.so动态库。事实上,ATLAS的动态库中已经包含了LAPACK静态库的所有符号和代码。
下面可以开始编译依赖LAPACK和ATLAS库的NumPy包了。
3. 编译优化版NumPy包
前提:官网下载NumPy源码包并解压,这里以目前最新版numpy-1.9.2.tar.gz为例进行说明。
1) cd至解压目录numpy-1.9.2
2) cp site.cfg.example site.cfg
3) 在site.cfg中配置atlas项,其中include_dirs和library_dirs是atlas库安装路径下的include和lib目录

[plain] view plain 在CODE上查看代码片派生到我的代码片
[atlas]
atlas_libs = lapack,f77blas,cblas,atlas
library_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib
include_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include
4) python setup.py config
5) python setup.py build --fcompiler=gnu95 ## 指定Fortran编译器为GCC4.8工具集中的gfortran
6) python setup.py install
正常情况下,build成功后,install会把编译产出拷贝到当前python解释器安装路径下的lib/python2.7/site-packages目录中。

‘拾’ c语言科学计数法,输入2.123456 e 2输出21.23456,但是输入2.1234567 e 2就不行

for(i=0;i<10;i++)
你这个循环,决定了e只能在前10个字符。所以如果想第二个数被允许:
for(i=0;i<15;i++) 就可以了