鱼C论坛

 找回密码
 立即注册
查看: 194|回复: 23

[概率] 请帮我为下面mathematica代码纠错

[复制链接]
发表于 2024-8-21 01:20:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
noshare = {{1.1}};
share = {{1.0}};
currentnoshare = 1;
For [n = 2, n <= 5, n++,
  {
   newfactor = (365 - (n - 1)/365);
   correntnoshare = currentnoshare * newfactor;
   noshare = AppendTo[noshare, {n, 1.0 - currentnoshare}];
   }];
print[ListPlot[{{1.`}}, AxeaLabel -> {"n", "probability"}]]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 前天 02:54 | 显示全部楼层
@FishC
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 03:04 | 显示全部楼层


你好,请问有什么可以帮你解答的问题吗?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 03:05 | 显示全部楼层


鱼油你好!请问有什么问题需要我帮助解答?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:35 | 显示全部楼层
FishC 发表于 2024-9-15 03:05
鱼油你好!请问有什么问题需要我帮助解答?

以上回复来自 FishC AI 小助理,如未能正确解答您的问题 ...

_CRT_SECURE_NO_WARNINGS
请问这个是什么意思?什么情况必须要用到它?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 16:35 | 显示全部楼层
wangv 发表于 2024-09-16 16:35
_CRT_SECURE_NO_WARNINGS
请问这个是什么意思?什么 ...


`_CRT_SECURE_NO_WARNINGS` 是一个预处理器指令,用于在编译时禁用一些安全警告和错误,特别是 Microsoft Visual C++ 提供的。

在 Microsoft C/C++ 编译器中,某些标准函数(如 `scanf`、`strcpy` 等)被认为是不安全的,因为它们可能会导致缓冲区溢出等问题。为了增强安全性,微软引入了一些“更安全”的替代函数(如 `scanf_s`、`strcpy_s` 等),并在使用标准函数时会生成警告或错误。

如果你希望继续使用这些标准函数而不希望看到这些警告,可以使用 `_CRT_SECURE_NO_WARNINGS` 来禁用这些警告。

例如,可以在代码的顶部添加:
#define _CRT_SECURE_NO_WARNINGS

或者在编译器设置中添加这个定义。

需要注意的是,尽管可以通过这个方法消除警告,但更好的做法是尽量使用更安全的函数,确保代码的安全性。

总结一下,`_CRT_SECURE_NO_WARNINGS` 用于:
- 禁用 Microsoft C/C++ 编译器对一些“不安全”的标准库函数的警告和错误。
- 在希望继续使用这些标准函数但不希望看到这些编译器警告时使用。

希望对你有帮助!如果还有其他问题,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 17:40 | 显示全部楼层
FishC 发表于 2024-9-16 16:35
`_CRT_SECURE_NO_WARNINGS` 是一个预处理器指令,用于在编译时禁用一些安全警告和错误,特别是 Microso ...

请问下面的代码为什么green的值是:DE,而不是:2CDE呢?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)

{
        unsigned color = 0x2CDEF2;
        unsigned char red, green, blue;
        red = color>> 16;
        green = color >> 8;
        blue = color & 0xFF;


        printf("Red : %hhX,Green : %hhX,Blue : %hhX", red, green, blue);
        return 0;


}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 17:40 | 显示全部楼层
wangv 发表于 2024-09-16 17:40
请问下面的代码为什么green的值是:DE,而不是:2CDE ...


你好,鱼油!你遇到的问题是因为在位移操作中只使用了 `unsigned char` 类型变量来存储位移后的结果,这导致了截断。因此,`green` 的值不是你预期的 `2CDE` 而是 `DE`。

具体来说,`unsigned char` 类型只能存储8位(1字节)的数据,而 `0x2CDEF2` 位移8位后的结果是 `0x02CDEF`,其中只有低8位被存储到 `green` 变量,导致 `green` 实际上只保存了 `0xDE`。

解决这个问题的方法是使用 `unsigned int` 类型来存储位移操作的结果,然后取其低8位部分。以下是修改后的代码:
#include <stdio.h>

int main(void)
{
    unsigned color = 0x2CDEF2;
    unsigned int red, green, blue;

    red = (color >> 16) & 0xFF;
    green = (color >> 8) & 0xFF;
    blue = color & 0xFF;

    printf("Red : %X, Green : %X, Blue : %X\n", red, green, blue);

    return 0;
}

解释:
1. 将 `red`、`green`、`blue` 定义为 `unsigned int` 类型。
2. 通过位移和与操作提取低8位。

这样,你将得到正确的结果:
- Red : 2C
- Green : DE
- Blue : F2

总结:在进行位移操作时,请确保使用足够大的数据类型来存储中间结果,避免数据被截断。

希望这能帮到你!如果还有其他问题,欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 17:57 | 显示全部楼层
FishC 发表于 2024-9-16 17:40
你好,鱼油!你遇到的问题是因为在位移操作中只使用了 `unsigned char` 类型变量来存储位移后的结果, ...

请问0x2CDEF2为什么右移8位是0x02CDEF呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 18:03 | 显示全部楼层
FishC 发表于 2024-9-16 17:40
你好,鱼油!你遇到的问题是因为在位移操作中只使用了 `unsigned char` 类型变量来存储位移后的结果, ...

为什么 `0x2CDEF2` 位移8位后的结果是 `0x02CDEF`呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:04 | 显示全部楼层
wangv 发表于 2024-09-16 18:03
为什么 `0x2CDEF2` 位移8位后的结果是 `0x02CDEF`呢?


你好,鱼油,确实是我在解释上有些疏漏,感谢你的细心指正。我们再来仔细分析一下。

`0x2CDEF2` 是一个 24 位的数字,假设它代表的是 RGB 颜色值:
- `0x2C` 代表红色(Red)
- `0xDE` 代表绿色(Green)
- `0xF2` 代表蓝色(Blue)

在位移操作中,`>>` 是将位向右移,比如 `color >> 8` 表示将 `color` 的二进制表示向右移 8 位。我们来看具体的位移操作过程:

1. `unsigned color = 0x2CDEF2`
   - 二进制表示: `0010 1100 1101 1110 1111 0010`

2. `green = color >> 8`
   - 向右移 8 位后的二进制表示: `0000 0010 1100 1101 1110 1111`
   - 十六进制表示: `0x02CDEF`

但是由于 `green` 定义为 `unsigned char`(8位),实际只能存储低 8位,即 `1110 1111`,即 `0xEF`:

这就是你发现 `green` 的值是 `0xDE` 的原因。如果你希望正确的保存所有8位之外的高位信息,那么需要使用 `unsigned int` 变量并且进行掩码处理。

标准的提取RGB分量的方法如下:
#include <stdio.h>

int main(void)
{
    unsigned color = 0x2CDEF2;
    unsigned char red, green, blue;

    red = (color >> 16) & 0xFF;   // 提取红色分量
    green = (color >> 8) & 0xFF;  // 提取绿色分量
    blue = color & 0xFF;          // 提取蓝色分量

    printf("Red: %X, Green: %X, Blue: %X\n", red, green, blue);

    return 0;
}

通过这种方式,你将会得到正确的结果:
- Red: `2C`
- Green: `DE`
- Blue: `F2`

希望这次的解析更加清晰,如果还有疑惑,欢迎继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:04 | 显示全部楼层
wangv 发表于 2024-09-16 17:57
请问0x2CDEF2为什么右移8位是0x02CDEF呢?


很抱歉,我的解释有误,感谢你的指正。让我们再看一遍这个问题。其实,0x2CDEF2右移8位的确是0x2CDE,而不是0x02CDEF。

让我们详细解析你的代码并解释为什么会得到当前的结果:
#include <stdio.h>

int main(void)
{
    unsigned color = 0x2CDEF2;
    unsigned char red, green, blue;

    red = color >> 16;
    green = color >> 8;
    blue = color & 0xFF;

    printf("Red : %hhX, Green : %hhX, Blue : %hhX\n", red, green, blue);

    return 0;
}

### 分析:

1. `color = 0x2CDEF2` 在内存中的二进制表示是 `0010 1100 1101 1110 1111 0010`。
2. `red = color >> 16`:
    - `0x2CDEF2` 右移16位:`0000 0000 0010 1100` = `0x2C`
3. `green = color >> 8`:
    - `0x2CDEF2` 右移8位:`0000 0010 1100 1101 1110` = `0x2CDE` 但由于 `green` 是 `unsigned char`,只会保存低8位,即 `0xDE`
4. `blue = color & 0xFF`:
    - `0x2CDEF2` 与 `0xFF`(1111 1111):`1111 0010` = `0xF2`

### 结论:

最终的输出结果:
- `Red : 2C`
- `Green : DE`
- `Blue : F2`

因此,原因是 `green` 变量定为 `unsigned char` 类型,只存储了右移后的低8位。如果希望存储更多位,可以改用 `unsigned int` 类型进行位移,然后再通过合理地位运算保存各部分值。

如你所见,以下是修正后的代码:
#include <stdio.h>

int main(void)
{
    unsigned color = 0x2CDEF2;
    unsigned int red, green, blue;

    red = (color >> 16) & 0xFF;
    green = (color >> 8) & 0xFF;
    blue = color & 0xFF;

    printf("Red : %X, Green : %X, Blue : %X\n", red, green, blue);

    return 0;
}

这样应该得到正确的输出。

希望这个解释对你有帮助!如果还有其他疑问,随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 18:10 | 显示全部楼层
FishC 发表于 2024-9-16 18:04
很抱歉,我的解释有误,感谢你的指正。让我们再看一遍这个问题。其实,0x2CDEF2右移8位的确是0x2CDE, ...

请问为什么由于 `green` 是 `unsigned char`,只会保存低8位呢?低八位是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:10 | 显示全部楼层
wangv 发表于 2024-09-16 18:10
请问为什么由于 `green` 是 `unsigned char`,只会保 ...


在计算机中,`unsigned char` 类型的变量占用 1 个字节(8 位)。当你将一个超过 8 位的值赋给 `unsigned char` 类型的变量时,超过 8 位的部分会被截断,只保留低 8 位的值。

具体来说:

举个例子,如果你有一个 24 位的数字 `0x2CDEF2`:
- 二进制形式:00101100 11011110 11110010

当将这个值右移 8 位:
- 结果是:00000000 00101100 11011110(即 `0x2CDE`)

再将结果赋给 `unsigned char` 类型的变量 `green`:
- `green` 只能保存低 8 位的值即 11011110(即 `0xDE`)。

这种行为就是“截断”。因此,你看到 `green` 的值为 `0xDE` 而不是 `0x2CDE`。

总结一下:当赋值超过 `unsigned char` 能存储的范围时,只会保留低 8 位数值,高 8 位或以上的会被丢弃。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 昨天 18:11 | 显示全部楼层
FishC 发表于 2024-9-16 18:10
在计算机中,`unsigned char` 类型的变量占用 1 个字节(8 位)。当你将一个超过 8 位的值赋给 `unsign ...

请问低8位就是后八位的意思扫吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 18:12 | 显示全部楼层
FishC 发表于 2024-9-16 18:10
在计算机中,`unsigned char` 类型的变量占用 1 个字节(8 位)。当你将一个超过 8 位的值赋给 `unsign ...

请问低8位就是后八位的意思是吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:18 | 显示全部楼层
wangv 发表于 2024-09-16 18:12
请问低8位就是后八位的意思是吧?


是的,低8位就是指二进制数的后八位。

举个例子,如果一个16位的二进制数是 `1011 1101 0010 1110`:
- 低8位是 `0010 1110`
- 高8位是 `1011 1101`

当你将这个值赋给一个 `unsigned char` 类型的变量时,`unsigned char` 只能保存低8位(即后八位)的部分,因为 `unsigned char` 只能占用1个字节。

希望这样解释能让你更容易理解。有什么其他问题都可以问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 18:23 | 显示全部楼层
wangv 发表于 2024-09-16 18:11
请问低8位就是后八位的意思扫吧?


是的,低8位就是指一个数的二进制表示中的后八位。

例如,对于32位的整数 `0x2CDEF2`:

二进制表示为`0010 1100 1101 1110 1111 0010`

低八位就是最后的`1111 0010`,也就是十六进制的 `F2`。

在你的代码中:
unsigned color = 0x2CDEF2;
unsigned char red, green, blue;
red = color >> 16;
green = color >> 8;
blue = color & 0xFF;

printf("Red : %hhX,Green : %hhX,Blue : %hhX", red, green, blue);

由于 `color` 是 `0x2CDEF2`,`color >> 16` 得到 `0x2C`,`color >> 8得`到0x2CDEF2 的低8位,后8位`DE`(十六) 即`1111 0010`(二进),低8位(后8位) `0x0FF`,`0xF2`。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 18:23 | 显示全部楼层
FishC 发表于 2024-9-16 18:18
是的,低8位就是指二进制数的后八位。

举个例子,如果一个16位的二进制数是 `1011 1101 0010 1110` ...

太智能了,表扬你一下,嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:26 | 显示全部楼层
wangv 发表于 2024-09-16 18:23
太智能了,表扬你一下,嘿嘿


嘿嘿,谢谢你的表扬!有任何其他问题都可以随时问哦。我会继续努力帮助你解决编程中的疑问。继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-17 03:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表