c++ 出现1.#IND、1.#INF

本文详细解释了在编程中遇到的两种特殊浮点数值:无穷大(Infinity)和非数字(NaN),并探讨了这两种值产生的原因及如何避免。文章还对比了整型和浮点型数据在进行除法运算时的区别。
部署运行你感兴趣的模型镜像

 1.#INF / inf:这个值表示“无穷大 (infinity 的缩写)”,即超出了计算机可以表示的浮点数的最大范围(或者说超过了 double 类型的最大值)。例如,当用 0 除一个整数时便会得到一个1.#INF / inf值;相应的,如果用 0 除一个负整数也会得到 -1.#INF / -inf 值。

2.-1.#IND / nan:这个的情况更复杂,一般来说,它们来自于任何未定义结果(非法)的浮点数运算。"IND"是 indeterminate 的缩写,而"nan"是 not a number 的缩写。产生这个值的常见例子有:对负数开平方,对负数取对数,0.0/0.00.0*∞, ∞/∞ 等。

简而言之,如果遇到 1.#INF / inf,就检查是否发生了运算结果溢出除零,而遇到 1.#IND / nan,就检查是否发生了非法的运算。

 

如果出现1.#INF的情况,说明程序中做除法时发生了除0。那程序编译怎么能通过呢?

原来除数为0有两种情况。

 

(1)除数显式为0,无论是整型还是浮点型都不能通过编译。

   如:cout<< 2/0<<endl;

 会显示: 错误 1 error C2124: 被零除或对零求模 

 

(2)除数隐式为0,无论是整型还是浮点型都能通过编译,但整型将报错且其后程序不再执行。浮点型执行得到正无穷大或负无穷大,依被除数而定,且其后程序正常执行。


   如:int i=0;cout<< 2/i<<endl;

      testexe 中的 0x000000013f2112cb 处有未经处理的异常: 0xC0000094: Integer division by zero

  而 

      float i=0.0;   cout<< 2/i<<endl; 这样程序就不会报错,并且继续执行。

 

      二者的区别是由在计算机中储存不同类型的数据方法的不同决定的。

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

import socket as st import pandas as pd from matplotlib.gridspec import GridSpec from matplotlib import pyplot as plt import matplotlib matplotlib.rc("font", family='KaiTi') def menu(): print('\t|学生成绩管理系统|\t') print('*' * 8 + '1统计数据' + '*' * 8) print('*' * 8 + '2查询成绩' + '*' * 8) print('*' * 8 + '3绘制图表' + '*' * 8) def draw(): # C基础的及格率 inf_C = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础') pass_count = len(inf_C[inf_C['考试成绩'] >= 60]) fail_count = len(inf_C) - len(inf_C[inf_C['考试成绩'] >= 60]) C_pass_rate = pass_count / len(inf_C) C_fail_rate = fail_count / len(inf_C) # 数据结构的及格率 inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构') pass_count = len(inf_data[inf_data['考试成绩'] >= 60]) fail_count = len(inf_data) - len(inf_data[inf_data['考试成绩'] >= 60]) Data_pass_rate = pass_count / len(inf_data) Data_fail_rate = fail_count / len(inf_data) # STM32的及格率 inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32') pass_count = len(inf_STM32[inf_STM32['考试成绩'] >= 60]) fail_count = len(inf_STM32) - len(inf_STM32[inf_STM32['考试成绩'] >= 60]) STM_pass_rate = pass_count / len(inf_STM32) STM_fail_rate = fail_count / len(inf_STM32) # C++的及格率 inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++') pass_count = len(inf_cpp[inf_cpp['考试成绩'] >= 60]) fail_count = len(inf_cpp) - len(inf_cpp[inf_cpp['考试成绩'] >= 60]) Cpp_pass_rate = pass_count / len(inf_cpp) Cpp_fail_rate = fail_count / len(inf_cpp) # 创建子图 fig, ax = plt.subplots(2, 2) # 绘制饼图 labels = ['及格', '不及格'] Csize = [C_pass_rate, C_fail_rate] Datasize = [Data_pass_rate, Data_fail_rate] STMsize = [STM_pass_rate, STM_fail_rate] Cppsize = [Cpp_pass_rate, Cpp_fail_rate] ax[0, 0].pie(Csize, labels=labels, autopct='%1.1f%%') ax[0, 0].set_title('C基础') ax[0, 1].pie(Datasize, labels=labels, autopct='%1.1f%%') ax[0, 1].set_title('数据结构') ax[1, 0].pie(STMsize, labels=labels, autopct='%1.1f%%') ax[1, 0].set_title('STM32') ax[1, 1].pie(Cppsize, labels=labels, autopct='%1.1f%%') ax[1, 1].set_title('C++') # 创建子图 fig = plt.figure(figsize=[10, 9]) gs = GridSpec(3, 2) # 绘制饼图 labels = ['及格', '不及格'] Csize = [C_pass_rate, C_fail_rate] Datasize = [Data_pass_rate, Data_fail_rate] STMsize = [STM_pass_rate, STM_fail_rate] Cppsize = [Cpp_pass_rate, Cpp_fail_rate] ax1 = fig.add_subplot(gs[0, 0]) plt.pie(Csize, labels=labels, autopct='%1.1f%%') plt.title('C基础') ax2 = fig.add_subplot(gs[0, 1]) plt.pie(Datasize, labels=labels, autopct='%1.1f%%') plt.title('数据结构') ax3 = fig.add_subplot(gs[1, 0]) plt.pie(STMsize, labels=labels, autopct='%1.1f%%') plt.title('STM32') ax4 = fig.add_subplot(gs[1, 1]) plt.pie(Cppsize, labels=labels, autopct='%1.1f%%') plt.title('C++') Cret = inf_C.sort_values('考试成绩', ascending=False, ignore_index=True) classname = ['C基础', '数据结构', 'STM32', 'C++'] peo = Cret.head() lst = [] for i in range(5): lst.append(peo['机位号'][i] - 1) ctemp = inf_C['考试成绩'].loc[lst[0:5]] dtemp = inf_data['考试成绩'].loc[lst[0:5]] stemp = inf_STM32['考试成绩'].loc[lst[0:5]] cpptemp = inf_cpp['考试成绩'].loc[lst[0:5]] ax5 = fig.add_subplot(gs[2, :]) for i in range(5): newlst = [ctemp.iloc[i], dtemp.iloc[i], stemp.iloc[i], cpptemp.iloc[i]] ax5.plot(classname, newlst, label=f'第{i + 1}') plt.legend() plt.savefig('imagin.png') plt.close() with open('imagin.png', 'rb') as img: # rb以二进制式读取文件 tep = img.read() # 获取二进制数据 return tep def Stat(): # 统计数据 # 统计C语言成绩 inf_C = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础') c_maxscore = inf_C['考试成绩'].max() c_minscore = inf_C['考试成绩'].min() c_averscore = inf_C['考试成绩'].mean() c_percent_of_pass = inf_C[inf_C['考试成绩'] >= 60].shape[0] / inf_C['考试成绩'].shape[0] # 统计数据结构成绩 inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构') data_maxscore = inf_data['考试成绩'].max() data_minscore = inf_data['考试成绩'].min() data_averscore = inf_data['考试成绩'].mean() data_percent_of_pass = inf_data[inf_data['考试成绩'] >= 60].shape[0] / inf_data['考试成绩'].shape[0] # 统计STM32成绩 inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32') STM_maxscore = inf_STM32['考试成绩'].max() STM_minscore = inf_STM32['考试成绩'].min() STM_averscore = inf_STM32['考试成绩'].mean() STM_percent_of_pass = inf_STM32[inf_STM32['考试成绩'] >= 60].shape[0] / inf_STM32['考试成绩'].shape[0] # 统计C++成绩 inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++') cpp_maxscore = inf_cpp['考试成绩'].max() cpp_minscore = inf_cpp['考试成绩'].min() cpp_averscore = inf_cpp['考试成绩'].mean() cpp_percent_of_pass = inf_cpp[inf_cpp['考试成绩'] >= 60].shape[0] / inf_cpp['考试成绩'].shape[0] data = {'最高分': [c_maxscore, data_maxscore, STM_maxscore, cpp_maxscore], '最低分': [c_minscore, data_minscore, STM_minscore, cpp_minscore], '平均分': [c_averscore, data_averscore, STM_averscore, cpp_averscore], '及格率': [c_percent_of_pass, data_percent_of_pass, STM_percent_of_pass, cpp_percent_of_pass]} ind = ['C基础', '数据结构', 'STM32', 'C++'] df = pd.DataFrame(data, index=ind) # 追加式 with pd.ExcelWriter('./StudentScore.xlsx', engine='openpyxl', mode='a') as writer: df.to_excel(writer, index=False,sheet_name='sheet') return '统计完成' def searchstu(name): # 统计各科成绩 inf_c = pd.read_excel('./StudentScore.xlsx', sheet_name='C基础') inf_data = pd.read_excel('./StudentScore.xlsx', sheet_name='数据结构') inf_STM32 = pd.read_excel('./StudentScore.xlsx', sheet_name='STM32') inf_cpp = pd.read_excel('./StudentScore.xlsx', sheet_name='C++') scorec = inf_c[inf_c['姓名'] == name]['考试成绩'] scoredata = inf_data[inf_data['姓名'] == name]['考试成绩'] scoreSTM = inf_STM32[inf_STM32['姓名'] == name]['考试成绩'] scorecpp = inf_cpp[inf_cpp['姓名'] == name]['考试成绩'] ret = f"{name}的成绩:C基础:{scorec.iloc[0]},数据结构:{scoredata.iloc[0]},STM32:{scoreSTM.iloc[0]},C++:{scorecpp.iloc[0]}" print(ret) return ret def SearchClassName(classname): fd = pd.read_excel('./StudentScore.xlsx', sheet_name=classname) class_maxscore = fd['考试成绩'].max() class_minscore = fd['考试成绩'].min() class_averscore = fd['考试成绩'].mean() class_percent_of_pass = fd[fd['考试成绩'] >= 60].shape[0] / fd['考试成绩'].shape[0] temp = f'该课程的最高分为:{class_maxscore},最低分为:{class_minscore},平均分为:{class_averscore},及格率为:{class_percent_of_pass}' print(temp) return temp if __name__ == '__main__': # 创建套接字 sfd = st.socket(st.AF_INET, st.SOCK_STREAM) # 绑定 sfd.bind(('192.168.8.92', 9999)) # 监听 sfd.listen(5) # 等待客户端的连接,connect_fd是用于通信的套接字 connect_fd, addr = sfd.accept() print('连接成功') while 1: menu() buf = connect_fd.recv(32) if buf.decode() == '1': temp = Stat() connect_fd.send(temp.encode()) elif buf.decode() == '2': print('请输入你想查询的东西,查询学生请按s,查询课程成绩信息请按c:') num = connect_fd.recv(32) if num.decode() == 's': print('请输入学生姓名:') n = connect_fd.recv(32) temp = searchstu(n.decode()) connect_fd.send(temp.encode()) elif num.decode() == 'c': print('请输入要查询的课程:') n = connect_fd.recv(32) temp = SearchClassName(n.decode()) connect_fd.send(temp.encode()) elif buf.decode() == '3': img_bytes = draw() text = "绘制完成" connect_fd.send(text.encode()) connect_fd.send(img_bytes) elif buf.decode() == 'quit': break connect_fd.close() import socket as st from PIL import Image import io import matplotlib.pyplot as plt def menu(): print('\t|学生成绩管理系统|\t') print('*' * 8 + '1统计数据' + '*' * 8) print('*' * 8 + '2查询成绩' + '*' * 8) print('*' * 8 + '3绘制图表' + '*' * 8) sfd = st.socket(st.AF_INET, st.SOCK_STREAM) sfd.connect(('192.168.8.92', 9999)) while 1: menu() order1 = input('输入命令:') if order1 == '1': sfd.send(order1.encode()) rbuf = sfd.recv(32) print(rbuf.decode()) if order1 == '2': sfd.send(order1.encode()) order2 = input('请输入你想查询的东西,查询学生请按s,查询课程成绩信息请按c:') if order2 == 's' or 'c': if order2 == 's': order3 = input('输入学生的姓名:') elif order2 == 'c': order3 = input('输入科目的姓名:') else: print('输入错误!') continue sfd.send(order2.encode()) sfd.send(order3.encode()) rbuf = sfd.recv(256) print(rbuf.decode()) if order1 == '3': sfd.send(order1.encode()) txt = sfd.recv(32) print(txt.decode()) binary_data = sfd.recv(1024) image_file = io.BytesIO(binary_data) image = Image.open(image_file) image.show() if order1 == 'quit': sfd.send(order1.encode()) break sfd.close()
最新发布
08-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值