# 4장: 수식, math

### 1. 수학 표현식 개요

TCL의 수학 표현식은 숫자 계산을 수행하는 데 사용됩니다. `expr` 명령을 통해 평가됩니다.

**기본 구문:**

```tcl
expr 수식
```

### 2. 기본 연산자

* **덧셈:** `+`
* **뺄셈:** `-`
* **곱셈:** `*`
* **나눗셈:** `/`
* **모듈로 (나머지):** `%`
* **거듭제곱:** `**`

**예시:**

```tcl
puts [expr {5 + 3}]     # 출력: 8
puts [expr {10 - 4}]    # 출력: 6
puts [expr {3 * 4}]     # 출력: 12
puts [expr {20 / 4}]    # 출력: 5
puts [expr {17 % 5}]    # 출력: 2
puts [expr {2 ** 3}]    # 출력: 8
```

### 3. 비교 연산자

* **같음:** `==`
* **다름:** `!=`
* **크다:** `>`
* **작다:** `<`
* **크거나 같다:** `>=`
* **작거나 같다:** `<=`

**예시:**

```tcl
puts [expr {5 == 5}]    # 출력: 1 (참)
puts [expr {5 != 4}]    # 출력: 1 (참)
puts [expr {6 > 4}]     # 출력: 1 (참)
puts [expr {3 < 2}]     # 출력: 0 (거짓)
```

### 4. 논리 연산자

* **AND:** `&&`
* **OR:** `||`
* **NOT:** `!`

**예시:**

```tcl
puts [expr {(5 > 3) && (2 < 4)}]  # 출력: 1 (참)
puts [expr {(5 < 3) || (2 < 4)}]  # 출력: 1 (참)
puts [expr {!(5 < 3)}]            # 출력: 1 (참)
```

### 5. 비트 연산자

2진수 수준에서 비트를 연산합니다.

예를들어,

10진수 1은 1,

10진수2는 10,

10진수 4는 100입니다.

2진수 100을 '>>' 하면 비트가 하나씩 오른쪽으로 옮겨져 2진수 10이 됩니다.

* **AND:** `&`
* **OR:** `|`
* **XOR:** `^`
* **NOT:** `~`
* **왼쪽 시프트:** `<<`
* **오른쪽 시프트:** `>>`

**예시:**

```tcl
puts [expr {5 & 3}]     # 출력: 1
puts [expr {5 | 3}]     # 출력: 7
puts [expr {5 ^ 3}]     # 출력: 6
puts [expr {~5}]        # 출력: -6
puts [expr {1 << 3}]    # 출력: 8
puts [expr {8 >> 1}]    # 출력: 4
```

### 6. 수학 함수

TCL은 다양한 내장 수학 함수를 제공합니다:

* **절대값:** `abs(x)`
* **제곱근:** `sqrt(x)`
* **지수:** `exp(x)`
* **로그:** `log(x)`, `log10(x)`
* **삼각함수:** `sin(x)`, `cos(x)`, `tan(x)`
* **반올림:** `round(x)`
* **최대/최소:** `max(x,y)`, `min(x,y)`

**예시:**

```tcl
puts [expr {abs(-5)}]        # 출력: 5
puts [expr {sqrt(16)}]       # 출력: 4.0
puts [expr {round(3.7)}]     # 출력: 4
puts [expr {max(5, 10)}]     # 출력: 10
```

### 7. 변수 사용

수학 표현식 내에서 변수를 직접 사용할 수 있습니다:

```tcl
set x 5
set y 3
puts [expr {$x + $y}]  # 출력: 8
```

### 8. 주의사항 ⚠️

* 부동소수점 연산 시 정밀도 주의.
* 0으로 나누기 오류 주의
* 복잡한 표현식은 가독성을 위해 괄호 사용 권장

### 9. 여러 수학식 사용 및 계산 우선순위

TCL의 수학 표현식에서 연산자 우선순위는 일반적인 수학 규칙을 따릅니다. 우선순위가 높은 연산자가 먼저 계산됩니다.

우선순위 (높음에서 낮음 순):

1. `()` 괄호
2. `**` 거듭제곱
3. `*`, `/`, `%` 곱셈, 나눗셈, 나머지 연산
4. `+`, `-` 덧셈, 뺄셈
5. `<<`, `>>` 비트 시프트
6. `<`, `>`, `<=`, `>=` 비교 연산자
7. `==`, `!=` 동등성 비교
8. `&` 비트 AND
9. `^` 비트 XOR
10. `|` 비트 OR
11. `&&` 논리 AND
12. `||` 논리 OR
13. `?:` 삼항 연산자

**예시:**

```tcl
puts [expr {2 + 3 * 4}]     # 출력: 14 (3 * 4가 먼저 계산됨)
puts [expr {(2 + 3) * 4}]   # 출력: 20 (괄호 안이 먼저 계산됨)
puts [expr {1 + 2 * 3 ** 2}]  # 출력: 19 (3 ** 2 -> 2 * 9 -> 1 + 18 순서로 계산)
```

### 11. 팁과 요령 💡

* 복잡한 표현식은 괄호를 사용하여 의도를 명확히 표현. 리뷰어를 위해.
* 여러 수학식을 사용할 때는 각 식의 목적을 주석으로 설명
* 우선순위가 불분명한 경우 괄호를 사용하여 명시적으로 순서 지정
* 긴 표현식은 여러 줄로 나누어 가독성 향상


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://vlsi-korea.gitbook.io/chase-tcl/4-math.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
