UVA ~ 11809 ~ Floating-Point Numbers (数学,思维)

在这里插入图片描述
在这里插入图片描述

题意

在这里插入图片描述

思路

假设该数字表示为 X ∗ 2 Y X*2^Y X2Y,那我们要求解的就是 X ∗ 2 Y = A ∗ 1 0 B X*2^Y=A*10^B X2Y=A10B,M=(X的位数),E=(Y的位数)
如果直接去计算这个数字的话会很大,因为Y有30位长,这个数大概也就是 2 1 0 30 2^{10^{30}} 21030肯定是会炸的,所以想办法把这个数字去缩小一下,很容易想到使用 l o g log log取对数的方式。
l o g 10 ( X ∗ 2 Y ) = l o g 10 ( A ∗ 1 0 B ) log_{10}(X*2^Y)=log_{10}(A*10^B) log10(X2Y)=log10(A10B) =>
l o g 10 ( X ) + Y ∗ l o g 10 2 = l o g 10 ( A ) + B log_{10}(X)+Y*log_{10}2=log_{10}(A)+B log10(X)+Ylog102=log10(A)+B
因为题目中说这个数是一个尾码长度为为M,阶码长度为E最大的浮点数,那么 Y = 2 E − 1 Y=2^E-1 Y=2E1
X = 2 − 1 + 2 − 2 + … + 2 − 1 − M X = 2^{-1} + 2^{-2} + … + 2^{-1-M} X=21+22++21M => X = 1 − 2 − 1 − M X = 1-2^{-1-M} X=121M
我们通过枚举答案 M 和 E 求得 X 和 Y ,如果符合 l o g 10 ( X ) + Y ∗ l o g 10 2 = l o g 10 ( A ) + B log_{10}(X)+Y*log_{10}2=log_{10}(A)+B log10(X)+Ylog102=log10(A)+B,那么就是答案。

注意可能会有精度损失,所以判断两个数字相等的时候不能直接用==,而是当误差小于某个值时就认为相等。

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-7;
int main()
{
    char s[30];
    while (~scanf("%s%*c", s) && strcmp(s, "0e0") != 0)
    {
        LL A = s[0]-'0', B = 0;
        for (int i = 2; i < 17; i++) A = A*10+s[i]-'0';
        for (int i = 18; i < strlen(s); i++) B = B*10+s[i]-'0';
        double t = log10(A)+B-15;
        bool flag = false;
        for (int i = 0; i < 10; i++)
        {
            for (int j = 1; j <= 30; j++)
            {
                double X = 1 - pow(2, -1-i), Y = pow(2, j)-1;
                double ans = log10(X)+Y*log10(2);
                if (fabs(ans - t) < eps)
                {
                    flag = true;
                    printf("%d %d\n", i, j);
                    break;
                }
            }
            if (flag) break;
        }
    }
    return 0;
}
/*
5.699141892149156e76
9.205357638345294e18
0e0
*/

xilinx floating-point ip是指xilinx公司开发的用于浮点数数据处理的IP核。它可以实现浮点数的转换、 #### 引用[.reference_title] - *1* [十三、Xilinx floating-point IP 使用说明](https://blog.csdn.net/weixin_41838250/article/details/125874095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [【教程】Xilinx FPGA里面的AXI DMA IP核的简单用法(以读写Floating-point IP核数据为例)](https://blog.csdn.net/ZLK1214/article/details/113144766)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [fp23fftk:最新的Xilinx FPGA的浮点正向反向快速傅立叶变换(FFT)IP内核(源语言-VHDL)](https://download.csdn.net/download/weixin_42102713/14990566)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值